即使各组之间的水平值不相等,我也希望使每个组中的水平相等。下面是我要实现的示例:
df = pd.DataFrame({'A' : ['foo']*3 + ['bar']*4,
...: 'B' : [0,1,2,0,1,2,3],
...: 'C' : np.random.randn(7)})
现在,如果我按列A
和B
进行分组,则输出将如下所示:
>> print(df.groupby(['A', 'B']).sum())
A B
bar 0 -1.452272
1 0.331986
2 0.764295
3 1.863472
foo 0 -1.066971
1 -0.411573
2 0.158449
我要实现以下目标:
A B
bar 0 -1.452272
1 0.331986
2 0.764295
3 1.863472
foo 0 -1.066971
1 -0.411573
2 0.158449
3 0.000000
我对此进行了很多搜索,但无法弄清楚。
答案 0 :(得分:2)
在代码后添加unstack
和stack
df.groupby(['A', 'B']).sum().unstack(fill_value=0).stack()
Out[372]:
C
A B
bar 0 -0.243351
1 -0.568541
2 1.529810
3 -0.327521
foo 0 -2.380512
1 1.088617
2 -0.125879
3 0.000000
答案 1 :(得分:1)
另一种选择是使用pd.crosstab
和stack
:
pd.crosstab(df['A'], df['B'], df['C'], aggfunc='sum').stack(dropna=False).fillna(0)
输出:
A B
bar 0 0.553563
1 0.357182
2 -0.294756
3 1.176766
foo 0 -0.514786
1 1.841072
2 0.792337
3 0.000000
dtype: float64