Предположим, у меня есть следующий DataFrame:
df = pd.DataFrame({'Event': ['A', 'B', 'A', 'A', 'B', 'C', 'B', 'B', 'A', 'C'],
'Date': ['2019-01-01', '2019-02-01', '2019-03-01', '2019-03-01', '2019-02-15',
'2019-03-15', '2019-04-05', '2019-04-05', '2019-04-15', '2019-06-10'],
'Sale': [100, 200, 150, 200, 150, 100, 300, 250, 500, 400]})
df['Date'] = pd.to_datetime(df['Date'])
df
Event Date Sale
A 2019-01-01 100
B 2019-02-01 200
A 2019-03-01 150
A 2019-03-01 200
B 2019-02-15 150
C 2019-03-15 100
B 2019-04-05 300
B 2019-04-05 250
A 2019-04-15 500
C 2019-06-10 400
Я хотел бы получить следующий результат:
Event Date Sale Total_Previous_Sale
A 2019-01-01 100 0
B 2019-02-01 200 0
A 2019-03-01 150 100
A 2019-03-01 200 100
B 2019-02-15 150 200
C 2019-03-15 100 0
B 2019-04-05 300 350
B 2019-04-05 250 350
A 2019-04-15 500 450
C 2019-06-10 400 100
, где df['Total_Previous_Sale']
- общая сумма продажи (df['Sale']
) когда событие (df['Event']
) происходит до его смежной даты (df['Date']
).Например,
- Общая сумма продажи события A до 2019-01-01 равна 0,
- Общая сумма продажи события A происходит до 2019-03-01 равен 100, а
- Общая сумма продажи события А до 2019-04-15 гг. Составляет 100 + 150 + 200 = 450.
По сути, этопочти такая же, как условная кумулятивная сумма, но только для всех предыдущих значений (исключая текущее значение [s]).Я могу получить желаемый результат, используя эту строку:
df['Sale_Total'] = [df.loc[(df['Event'] == df.loc[i, 'Event']) & (df['Date'] < df.loc[i, 'Date']),
'Sale'].sum() for i in range(len(df))]
Хотя это медленно, но работает нормально.Я считаю, что есть лучший и быстрый способ сделать это.Я пробовал эти строки:
df['Total_Previuos_Sale'] = df[df['Date'] < df['Date']].groupby(['Event'])['Sale'].cumsum()
или
df['Total_Previuos_Sale'] = df.groupby(['Event'])['Sale'].shift(1).cumsum().fillna(0)
, но он генерирует NaN или приводит к нежелательному результату.