2017-03-17 142 views
1

问题包含在大熊猫GROUPBY聚合

包含在大熊猫GROUPBY聚合的输出所有可能的值或值的组合缺失值的组合。

例大熊猫据帧有三列,UserCode,并Subtotal

import pandas as pd 
example_df = pd.DataFrame([['a', 1, 1], ['a', 2, 1], ['b', 1, 1], ['b', 2, 1], ['c', 1, 1], ['c', 1, 1]], columns=['User', 'Code', 'Subtotal']) 

我想对UserCode组,并得到一个小计的每个组合UserCode

print(example_df.groupby(['User', 'Code']).Subtotal.sum().reset_index()) 

我得到的输出是:

User Code Subtotal 
0 a  1   1 
1 a  2   1 
2 b  1   1 
3 b  2   1 
4 c  1   2 

我怎么能包括表缺少组合User=='c'Code==2,即使它不存在example_df

优选输出

下面是优选的输出,具有零线为User=='c'Code==2组合。

User Code Subtotal 
0 a  1   1 
1 a  2   1 
2 b  1   1 
3 b  2   1 
4 c  1   2 
5 c  2   0 

回答

2

您可以使用unstackstack:由MultiIndex

print(example_df.groupby(['User', 'Code']).Subtotal.sum() 
       .unstack(fill_value=0) 
       .stack() 
       .reset_index(name='Subtotal')) 
    User Code Subtotal 
0 a  1   1 
1 a  2   1 
2 b  1   1 
3 b  2   1 
4 c  1   2 
5 c  2   0 

另一种解决方案与reindex创建from_product

df = example_df.groupby(['User', 'Code']).Subtotal.sum() 
mux = pd.MultiIndex.from_product(df.index.levels, names=['User','Code']) 
print (mux) 
MultiIndex(levels=[['a', 'b', 'c'], [1, 2]], 
      labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]], 
      names=['User', 'Code']) 

print (df.reindex(mux, fill_value=0).reset_index(name='Subtotal')) 
    User Code Subtotal 
0 a  1   1 
1 a  2   1 
2 b  1   1 
3 b  2   1 
4 c  1   2 
5 c  2   0