2016-04-28 83 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