2017-07-10 2 views
1

Ich habe einen geschwenkten Datenrahmen des Formulars.Pandas Cumsum auf geschwenktem Datenrahmen

 Quantity    Result    
Alpha  A B C  A  B  C 
Order           
1   3.0 0.0 0.0  Best None None 
2   0.0 6.0 4.0  None Good Good 
3   3.0 0.0 0.0 Average None None 

und ich versuche, eine weitere große Spalte namens CumulativeQty mit 3 Spalten zu erstellen, die ich die cumsum() der entsprechenden 3 Spalten in der Hauptspalte Menge sein will. Ohne die einzelnen Spalten einzeln zu spezifizieren, wie würde ich darüber gehen? Ich habe versucht,

p['CumulativeQty'] = p['Quantity'].cumsum(axis=1) 

aber beklagt, dass Valueerror: Falsche Anzahl von Artikel 3 übergeben, Platzierung 1.

Das gewünschte Ergebnis impliziert ist

  CumulativeQty      
Alpha  A B C  
Order           
1   3.0 0.0 0.0  
2   3.0 6.0 4.0  
3   6.0 6.0 4.0 

Unten ist, wie die Ausgangs zu bekommen geschwenkt Datenrahmen .

df = pd.DataFrame(data=[[1, "A", 3, "Best"], [2, "C", 4, "Good"], [2, "B", 6, "Good"], [3, "A", 3, "Average"]], 
        columns=["Order", "Alpha", "Quantity", "Result"]) 
p = df.pivot(index="Order", columns="Alpha") 
p['Quantity'] = p['Quantity'].fillna(0) 

Antwort

2

Option 1

p.join(p[['Quantity']].cumsum().rename(columns=dict(Quantity='Cumsum'))) 

     Quantity    Result    Cumsum   
Alpha  A B C  A  B  C  A B C 
Order               
1   3.0 0.0 0.0  Best None None 3.0 0.0 0.0 
2   0.0 6.0 4.0  None Good Good 3.0 6.0 4.0 
3   3.0 0.0 0.0 Average None None 6.0 6.0 4.0 

Option 2

pd.concat([ 
     p.Quantity, p.Result, p.Quantity.cumsum() 
    ], axis=1, keys=['Quantity', 'Result', 'Cumsum']) 

     Quantity    Result    Cumsum   
Alpha  A B C  A  B  C  A B C 
Order               
1   3.0 0.0 0.0  Best None None 3.0 0.0 0.0 
2   0.0 6.0 4.0  None Good Good 3.0 6.0 4.0 
3   3.0 0.0 0.0 Average None None 6.0 6.0 4.0 
1

Eine Möglichkeit, es zu tun ist:

for i in sorted(df.Alpha): 
    p['CumulativeQty',i] = p['Quantity',i].cumsum(axis=0) 

Bitte beachten Sie, dass ich axis=1 zu axis=0 geändert habe, weil Sie horizontal summiert haben und so Ihre gewünschte Ausgabe nicht erhalten haben.

Ausgabe:

 Quantity    Result    CumulativeQty   
Alpha  A B C  A  B  C    A B C 
Order                 
1   3.0 0.0 0.0  Best None None   3.0 0.0 0.0 
2   0.0 6.0 4.0  None Good Good   3.0 6.0 4.0 
3   3.0 0.0 0.0 Average None None   6.0 6.0 4.0 

Ihr Problem war im Grunde, dass Sie alle A B and C Ergebnisse innerhalb einer Spalte passen wollten. Es ist also im Grunde ein "MultiIndex" -Problem.

Verwandte Themen