2017-03-17 5 views
1

Problemeinschließlich Kombinationen von Werten in einer Pandas groupby Aggregation

einschließlich aller möglichen Werte oder Kombinationen von Werten in der Ausgabe eines Pandas groupby Aggregation fehlt.

Beispiel

Beispiel Pandas Datenrahmen hat drei Spalten, User, Code und 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']) 

Ich mag Gruppe auf User und Code und eine Zwischensumme für jede Kombination von User und Code.

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

Der Ausgang ich erhalte, ist:

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

Wie kann ich die fehlende Kombination User=='c' und Code==2 in der Tabelle enthalten, obwohl es nicht in example_df existiert?

bevorzugte Ausgabe

Unten ist die bevorzugte Ausgabe, mit einer Null-Linie für die User=='c' und Code==2 Kombination.

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 

Antwort

2

Sie können unstack verwenden mit stack:

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 

Eine andere Lösung mit reindex von MultiIndex erstellt 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 
Verwandte Themen