2017-03-17 140 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