Bedingte Summe über Zeilen in pandas groupby Anweisung

Ich habe ein Dataframe mit wöchentlichen Verkäufen für verschiedene Produkte (a, b, c):

In[1] df = pd.DataFrame({'product': list('aaaabbbbcccc'), 'week': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4], 'sales': np.power(2, range(12))}) Out[1] product sales week 0 a 1 1 1 a 2 2 2 a 4 3 3 a 8 4 4 b 16 1 5 b 32 2 6 b 64 3 7 b 128 4 8 c 256 1 9 c 512 2 10 c 1024 3 11 c 2048 4 

Ich möchte eine neue Spalte mit den kumulativen Verkäufen für die letzten n Wochen erstellen, gruppiert nach Produkt. ZB für n=2 sollte es sein wie last_2_weeks :

  product sales week last_2_weeks 0 a 1 1 0 1 a 2 2 1 2 a 4 3 3 3 a 8 4 6 4 b 16 1 0 5 b 32 2 16 6 b 64 3 48 7 b 128 4 96 8 c 256 1 0 9 c 512 2 256 10 c 1024 3 768 11 c 2048 4 1536 

Wie kann ich eine solche kumulative, bedingte Summe in Pandas effizient berechnen? Die Lösung sollte auch funktionieren, wenn es mehr Variablen zur Gruppe gibt, zB Produkt und Standort.

Ich habe versucht, eine neue Funktion zu groupby und groupby und apply , aber das funktioniert nur, wenn Zeilen sortiert sind. Auch ist es langsam und hässlich.

 def last_n_weeks(x): """ calculate sales of previous n weeks in aggregated data """ n = 2 cur_week = x['week'].iloc[0] cur_prod = x['product'].iloc[0] res = np.sum(df['sales'].loc[((df['product'] == cur_prod) & (df['week'] >= cur_week-n) & (df['week'] < cur_week))]) return res df['last_2_weeks'] = df.groupby(['product', 'week']).apply(last_n_weeks).reset_index(drop=True) 

One Solution collect form web for “Bedingte Summe über Zeilen in pandas groupby Anweisung”

Sie könnten pd.rolling_sum mit window=2 , dann einmal verschieben und NaNs mit 0 füllen

 In [114]: df['l2'] = (df.groupby('product')['sales'] .apply(lambda x: pd.rolling_sum(x, window=2, min_periods=0) .shift() .fillna(0))) In [115]: df Out[115]: product sales week l2 0 a 1 1 0 1 a 2 2 1 2 a 4 3 3 3 a 8 4 6 4 b 16 1 0 5 b 32 2 16 6 b 64 3 48 7 b 128 4 96 8 c 256 1 0 9 c 512 2 256 10 c 1024 3 768 11 c 2048 4 1536 
  • Pandas-Datentypen ändern sich beim Iterieren über die Hauptachse
  • Bedingte Summen für Pandas aggregate
  • Python teilt einen pandas datenrahmen nach woche oder monat und gruppiert die auf diesen sp
  • Python, wie man eine pandas-serie in ein pandas DataFrame umwandelt?
  • Beschleunigung der Pandas-Funktion
  • So wählen Sie den maximalen und minimalen Wert in einer Zeile für ausgewählte Spalten aus
  • Berechnen Sie Pandas DataFrame Zeitdifferenz zwischen zwei Spalten in Stunden und Minuten
  • Wie man Indizes von vielen dataframes ausrichtet und entsprechende fehlende Werte in Pandas ausfüllt?
  • Groupby - TypError 'DataFrame' Objekt ist nicht abrufbar
  • Formatierung tausend separator für ganze Zahlen in einem pandas dataframe
  • Mein Code mit Pandas Optionen funktioniert - jetzt wirft einen Fehler
  • Python ist die beste Programmiersprache der Welt.