Groupby + transform + lambda-функция от двух переменных
Есть DataFrame c несколькими уровнями группирующих ключей вида (группа, подгруппа уровня 1, подгруппа уровня 2 и тд.). Есть столбец значения 1 и значения 2. Необходимо создать столбец, являющийся результатом деления накопленной суммы значения 1 на накопленную сумму значения 2, причем, накопление этиx двух сумм происходит внутри, например, подгруппы уровня 2.
Я попытался выполнить конструкцию вида:
df['Cumsum_div']=df.groupby(by='Группа')[['значение 1','значение 2']].transform(lambda x,y: x.cumsum()/y.cumsum())
Код генерации примерных данных:
df_old = pd.DataFrame({'Группа':['A','A','B','B'],'Значение 1': [1, 3,3,1], 'Значение 2': [2, 5,3,4]})
Пример желаемого результата:
df_new = pd.DataFrame({'Группа':['A','A','B','B'], 'Значение 1': [1, 3,3,1], 'Значение 2': [2, 5,3,4], 'Cumsum_div': [0.5, 4/7, 1, 4/7]})
Результат должен быть следующего вида (внутри одной группы):
Группа Значение 1 Значений 2 Cumsum_div
А 1 2 0.5
А 3 5 0.57142857.....
B 3 3 1
B 1 4 0.57142857.....
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
In [46]: x = df_old.groupby("Группа").apply(lambda x: x["Значение 1"].cumsum() / x["Значение 2"].cumsum())
In [47]: df_old["Cumsum_div"] = x.to_numpy()
In [48]: df_old
Out[48]:
Группа Значение 1 Значение 2 Cumsum_div
0 A 1 2 0.500000
1 A 3 5 0.571429
2 B 3 3 1.000000
3 B 1 4 0.571429