Pandas groupby和选择器顺序

时间:2016-04-28 02:50:21

标签: python pandas

假设我有一个包含3列的数据框:

   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

我想为每个组计算ValuesCriteria == 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和选择器(在过滤前进行分组),但无法确定正确的语法。

我知道我可以接受我拥有的东西"重新插入"缺少具有malloc值的组但看起来有点乱,所以我想知道是否有更清洁/更简单的方法来做大熊猫?

2 个答案:

答案 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

使用rename_axisDataFrame pandas中的新内容)和reset_index更好地格式化0.18.0

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

答案 1 :(得分:0)

您可以使用Python的True表示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