假设我有一个包含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
我想为每个组计算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
和选择器(在过滤前进行分组),但无法确定正确的语法。
我知道我可以接受我拥有的东西"重新插入"缺少具有malloc
值的组但看起来有点乱,所以我想知道是否有更清洁/更简单的方法来做大熊猫?
答案 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_axis
(DataFrame
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
表示1
而False
为0
的事实:
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