упрощение кодов для pandas groupby().agg()

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных, который я пытаюсь сгруппировать и получить сумму для нескольких столбцов, для которых у меня есть приведенный ниже код:

 df=df.groupby(['year','month']).agg({'A':['sum'],'B':['sum'],'C':['sum'],'D':['sum']})
 

Есть ли способ, которым я мог бы изменить аргументы в agg() для перебора списка? Я пытаюсь сделать что-то подобное, но, очевидно, это не работает.

 col=['A','B','C','D']
df=df.groupby(['year','month']).agg({c for c in col})
 

Большое вам спасибо!

Комментарии:

1. df.groupby(['year','month'])[col].sum() следует сделать это, если col=['A','B','C','D'] , как вы включили в свой код, так по существу df.groupby(['year','month'])[['A','B','C','D']].sum()

Ответ №1:

Вы очень близки. Обратите внимание, что вы переходите в agg() набор, а не в словарь. В словаре есть пара key: value , где у вас просто есть value .

 df=df.groupby(['year','month']).agg({c: ['sum'] for c in df.columns})
 

Потому что:

 {c: ['sum'] for c in df.columns}
>>> {'A':['sum'],'B':['sum'],'C':['sum'],'D':['sum']}
 

В отличие от того, что вы написали:

 {c for c in df.columns}  # you iterated over cols, probably forgot cols=df.columns before. Changed it to df.columns here
>>> {'A', 'B', 'C', 'D'}
 

Редактировать:
Я также предполагаю, что вы не заинтересованы в суммировании всех ваших столбцов, только от ‘A’ до ‘D’. Если это действительно ваше намерение, как указано в других комментариях под вашим вопросом, вы можете просто сделать:

 df.groupby(['year','month']).sum()
 

Или

 df.groupby(['year','month']).agg('sum')