2016-04-28 89 views
2

說我有一個3列的數據幀:熊貓GROUPBY和選擇順序

Criteria Group Value 
0 A  0  0.1 
1 B  0  0.2 
2 B  1  0.3 
3 B  1  0.4 
4 A  2  0.5 

我要計算每個組的Values的項目,其中Criteria == A(或這可能是在條件比較複雜的總和Criteria欄)。到目前爲止,我有:

df[df.Criteria == 'A'].groupby(df.Group).Value.sum() 

但這並不包括沒有匹配的項目組,即我得到:

Group 
0 0.1 
2 0.5 

,而我想:

Group 
0 0.1 
1 0 
2 0.5 

我試着反轉groupby和選擇器(在過濾之前對其進行分組),但無法確定正確的語法。

我知道我可以把我所擁有的「重新插入」一個0價值的遺漏羣體,但這似乎有點凌亂,所以我想知道是否有一個更清潔/更簡單的方法來做到這一點與熊貓?

回答

2

我想你需要pivot_table

print pd.pivot_table(df, 
        index='Group', 
        columns='Criteria', 
        values='Value', 
        aggfunc=sum, 
        fill_value='0') 

Criteria A B 
Group    
0   0.1 0.2 
1   0 0.7 
2   0.5 0 
DataFrame

更好的格式與rename_axis(新中pandas0.18.0)和reset_index

print pd.pivot_table(df, 
        index='Group', 
        columns='Criteria', 
        values='Value', 
        aggfunc=sum, 
        fill_value='0').rename_axis(None, axis=1).reset_index() 

    Group A B 
0  0 0.1 0.2 
1  1 0 0.7 
2  2 0.5 0 

如果您需要選擇只列A

print pd.pivot_table(df, 
        index='Group', 
        columns='Criteria', 
        values='Value', 
        aggfunc=sum, 
        fill_value='0').rename_axis(None, axis=1).A 

Group 
0 0.1 
1  0 
2 0.5 
Name: A, dtype: object 
+0

這就是我想要的,太棒了!感謝提及rename_axis和reset_index,這些也很有用。 –

0

可以使用的事實,True Python的表示是1False0

In [12]: df 
Out[12]: 
    A  B 
0 0 True 
1 0 False 
2 1 False 
3 1 False 
4 2 True 

In [13]: df.groupby('A').sum().astype(int) 
Out[13]: 
    B 
A 
0 1 
1 0 
2 1 

In [14]: df.groupby('A').sum() 
Out[14]: 
     B 
A 
0 True 
1 False 
2 True 
+0

我簡化我的例子集讓事情變得簡單,在現實中我有更多的列,並不是所有的布爾值,我會想要聚合第三列太。所以你的答案在技術上是正確的,但我希望有一個更通用的解決方案來過濾羣組後的項目:)。 –

+0

@JulesOlléon,幫助社區爲您提供幫助。提供[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve) – MaxU

+0

@JulesOlléon,它不是很清楚你想實現什麼 – MaxU