В основном с использованием DataFrame.groupby
и diff
.К сожалению, первые строки, в которых отсутствует разность предыдущих строк, nan
, и это потребовало некоторой грязной очистки.Там может быть красивее путь.
df = pd.DataFrame(
data=[
['01-01-2018', 'Jakob', 5, 10],
['01-01-2018', 'Adomas', 10, 20],
['01-01-2018', 'Thomas', 15, 30],
['01-02-2018', 'Jakob', 50, 30],
['01-02-2018', 'Adomas', 100, 40],
['01-02-2018', 'Thomas', 150, 65],
['01-03-2018', 'Jakob', 60, 30],
['01-03-2018', 'Adomas', 120, 45],
['01-03-2018', 'Thomas', 200, 75]
],
columns=['Date', 'Sales rep', 'item A', 'item B']
)
cum_columns = ['item A', 'item B']
result = df.merge(
df.groupby('Sales rep')[cum_columns].diff(),
left_index=True, right_index=True, suffixes=['', '_uncum']
).fillna({'{}_uncum'.format(cum_column): df[cum_column] for cum_column in cum_columns})
print(result)
Out:
Date Sales rep item A item B item A_uncum item B_uncum
0 01-01-2018 Jakob 5 10 5.0 10.0
1 01-01-2018 Adomas 10 20 10.0 20.0
2 01-01-2018 Thomas 15 30 15.0 30.0
3 01-02-2018 Jakob 50 30 45.0 20.0
4 01-02-2018 Adomas 100 40 90.0 20.0
5 01-02-2018 Thomas 150 65 135.0 35.0
6 01-03-2018 Jakob 60 30 10.0 0.0
7 01-03-2018 Adomas 120 45 20.0 5.0
8 01-03-2018 Thomas 200 75 50.0 10.0