Агрегация с участием двух столбцов в pandas

#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 как принимает каждый столбец всего (вспомогательного) фрейма данных.