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
→ Ссылка