如何对DataFrame中列标题相同的列按索引求和?
解决重复列名按组求和的问题
这事儿其实用pandas的groupby就能轻松搞定,完全不用操心不同列名的重复次数差异——不管某个列名出现1次、3次甚至压根没出现,都能自动处理。
核心解决方案
直接对列索引(也就是你的重复列名)做分组,指定axis=1(按列分组),然后调用sum()就行。给你写个完整的示例,完全贴合你的需求:
import pandas as pd import numpy as np # 先构造你提供的示例DataFrame s = pd.Series([1,2,3,4,5], index=['6/7','6/8','6/9','6/10','6/11']) t = pd.Series([2,4,6,8,10], index=['6/7','6/8','6/9','6/10','6/11']) df = pd.DataFrame(np.c_[s,t,s*3,t*2.5], columns = ["M1","M2","M1","M2"]) # 关键操作:按列名分组求和 grouped_sum = df.groupby(df.columns, axis=1).sum() # 给列名加上_sum后缀,匹配你想要的输出格式 grouped_sum.columns = [f"{col}_sum" for col in grouped_sum.columns] print(grouped_sum)
运行这段代码后,输出就是你期望的结果:
M1_sum M2_sum 6/7 4.0 7.0 6/8 9.0 12.0 6/9 12.0 15.0 6/10 12.0 18.0 6/11 25.0 50.0
为什么这个方法有效?
groupby(df.columns, axis=1):这里的axis=1是核心,告诉pandas我们要**按列的名称(列索引)**来分组,而不是默认的按行分组。pandas会自动把所有列名相同的列归为一组,不管它重复多少次。.sum():对每个分组里的列,按行计算数值总和,正好实现你要的“同一行内同列名的列值相加”。- 最后重命名列名的步骤是可选的,但能让输出更符合你指定的
M1_sum、M2_sum格式。
哪怕你的DataFrame有上千列、列名从M1到M340,这个方法也能高效处理,不需要手动统计每个列名的重复次数,pandas会自动完成所有工作。
内容的提问来源于stack exchange,提问作者Nik Tur
相关产品推荐
相关产品推荐

