#python #pandas #dataframe
#питон #панды #фрейм данных
Вопрос:
Допустим, у меня есть фрейм данных pandas со следующей структурой:
df = pd.DataFrame(dict(a=["x", "x", "y"], b=[0, 1, 1], c=[1, 2, 2]))
Я хочу агрегировать группировку по a
и выполнять агрегацию, которая зависит от b
и c
. Я бы хотел сделать что-то вроде:
df.groupby("a").agg(lambda df: (df["b"] - df["c"]).sum())
но это выдает следующую ошибку в pandas:
KeyError: 'b'
Есть ли простой способ сделать это в pandas?
Конечно, я знаю, что могу сделать что-то вроде
df.assign(new_b = lambda df: df["b"] - df["c"]).groupby("a").agg({"new_b": 'sum'})
что дает следующий результат:
new_b
a
x -2
y -1
но должен быть более простой способ.
Комментарии:
1. То же самое я получаю, используя последнюю команду
Ответ №1:
Поскольку ваши операторы являются коммутативными, вы можете сделать:
out = df.groupby('a').sum()
out['new_b'] = out['b'] - out['c']
Выходной сигнал:
b c new_b
a
x 1 3 -2
y 1 2 -1
Примечание: Вы близки, это сработает
df.groupby("a").apply(lambda d: (d["b"] - d["c"]).sum())
Разница в том, что apply
принимает весь (вспомогательный) фрейм данных в качестве аргументов, в то время agg
как принимает каждый столбец всего (вспомогательного) фрейма данных.