Я хочу groupby
для данного кадра данных, а затем для каждой группы для данного столбца p
перезаписать значение его последнего элемента (каждой группы) на 1 - sum(p[:-1])
(с sum
, являющимся суммой все элементы, кроме последнего).
Обратите внимание, что после выполнения операции сумма всех значений в p
для каждой группы равна 1
.
Например, для этого входного кадра данных (группировка по c1
и c2
):
c1 c2 p
0 x a 0.4
1 y a 0.2
2 x a 0.3
3 y b 0.6
ожидаемый результат будет:
c1 c2 p
0 x a 0.4
1 y a 1.0
2 x a 0.6
3 y b 1.0
Мне удалось выполнить операцию, используя for
l oop:
for _, g in df.groupby(['c1', 'c2']):
df.loc[g.tail(1).index, 'p'] = 1 - g['p'][:-1].sum()
но я ищу более элегантный способ сделать это, без явного зацикливания каждой группы .
Я попробовал это:
>>> df.loc[df.groupby(['c1', 'c2']).tail(1).index, 'p']
1 0.2
2 0.3
3 0.6
>>> 1 - df.groupby(['c1', 'c2']).apply(lambda x: x.iloc[:-1].sum())['p']
c1 c2
x a 0.6
y a 1.0
b 1.0
Но я не знаю, как собрать эти выходные данные, если их индексы отличаются.