2017-03-28 71 views
2

我有以下形式的數據幀大熊貓:複製COUNTIFS()與多個條件

enter image description here

我想實現的是具有獨特的羣體和非零的計數的數據幀每列1-9。它看起來像下面。

enter image description here

我在這個損失相當多。我看到了here的問題,但這並沒有解決分組方面的問題。我如何使用熊貓來實現這個目標?

回答

3

假設你有以下DF:

In [82]: df 
Out[82]: 
    Group 1 2 3 4 5 
0 Group1 0 1 4 0 1 
1 Group1 3 0 4 1 5 
2 Group2 0 1 4 3 6 
3 Group2 5 1 4 0 7 
4 Group3 0 0 4 7 8 
5 Group3 7 1 4 7 9 

解決方案:

In [83]: df.set_index('Group').ne(0).groupby(level=0).sum().reset_index() 
Out[83]: 
    Group 1 2 3 4 5 
0 Group1 1.0 1.0 2.0 1.0 2.0 
1 Group2 1.0 2.0 2.0 1.0 2.0 
2 Group3 1.0 1.0 2.0 2.0 2.0 

的整數:

In [84]: df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index() 
Out[84]: 
    Group 1 2 3 4 5 
0 Group1 1 1 2 1 2 
1 Group2 1 2 2 1 2 
2 Group3 1 1 2 2 2 

UPDATE:

In [92]: df 
Out[92]: 
    Group 1 2 3 4 5 
0 Group1 0 1 4 0 0 
1 Group1 3 0 4 1 0 
2 Group2 0 1 4 3 0 
3 Group2 5 1 4 0 0 
4 Group3 0 0 4 7 0 
5 Group3 7 1 4 7 0 

In [93]: df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index() 
Out[93]: 
    Group 1 2 3 4 5 
0 Group1 1 1 2 1 0 
1 Group2 1 2 2 1 0 
2 Group3 1 1 2 2 0 

定時:

In [37]: %timeit df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index() 
100 loops, best of 3: 6.24 ms per loop 

In [38]: %timeit df.pivot_table(index='Group', aggfunc=np.count_nonzero) 
100 loops, best of 3: 19.2 ms per loop 

讓我們測試它針對一個更大(60.000行)DF:

In [39]: df = pd.concat([df] * 10**4, ignore_index=True) 

In [40]: df.shape 
Out[40]: (60000, 6) 

In [42]: %timeit df.set_index('Group').ne(0).groupby(level=0).sum().astype(int).reset_index() 
10 loops, best of 3: 22.4 ms per loop 

In [43]: %timeit df.pivot_table(index='Group', aggfunc=np.count_nonzero) 
10 loops, best of 3: 43 ms per loop 

結論:

IMO高級功能pivot_table較慢由於額外的開銷,但對於更大的數據集來說差異並不那麼巨大......

+0

智能......,點平滑...我應該做的。但是我明天可能會再次超過極限soooo – piRSquared

+0

@piRSquared,你知道哪裏可以讀到這個限制嗎? – MaxU

+1

元...提問...我現在知道了一點。上漲200點是限制。賞金,接受答案和接受的答案都是免除的。我主要關注的是不受上限影響的「熊貓」upvotes。這就是爲什麼我在達到上限後繼續回答良好的原因。 – piRSquared

2

從@MaxU解決方案使用DF:

df.pivot_table(index='Group', aggfunc=np.count_nonzero) 


     1 2 3 4 5 
Group     
Group1 1 1 2 1 2 
Group2 1 2 2 1 2 
Group3 1 1 2 2 2