如何用更Pythonic的方式在Pandas中按除columnK外的列分组求和columnK?
问题描述
我有一个包含columnA至columnM的DataFrame,数据示例如下:
columnA columnB .... columnK columnL columnM A AA .... 10 AAA AAAA A AA .... 20 AAA AAAA B BB .... 5 BBB BBBB A BB .... 40 AAA AAAA ...
我希望对该DataFrame进行分组操作:按除columnK外的所有列分组,对columnK列计算求和值,最终得到如下输出:
columnA columnB .... columnK columnL columnM A AA .... 30 AAA AAAA B BB .... 5 BBB BBBB A BB .... 40 AAA AAAA ...
我知道可以手动执行以下命令:
df.groupby(['columnA', 'columnB',...,'columnL', 'columnM'])['columnK'].sum().reset_index()
也就是在groupby中显式排除columnK,但有没有更Pythonic的实现方式?
解决方案
当然有几种更简洁、更符合Python风格的写法,不用手动罗列所有排除columnK的列:
- 列表推导式生成分组列
直接从DataFrame的列名集合中过滤掉columnK,这种方式更灵活,哪怕后续DataFrame的列名有变动,也不用修改分组列的列表:
group_cols = [col for col in df.columns if col != 'columnK'] result = df.groupby(group_cols)['columnK'].sum().reset_index()
- 使用
columns.drop()方法
利用Pandas提供的df.columns.drop()方法直接移除指定列,写法更紧凑:
result = df.groupby(df.columns.drop('columnK'))['columnK'].sum().reset_index()
这两种方式都能达到和手动指定分组列完全一致的效果,尤其当DataFrame列数较多时,优势会非常明显。
内容的提问来源于stack exchange,提问作者PV8
相关产品推荐
相关产品推荐

