Pandas:添加特定多列求和的总计行并保留数据类型
解决DataFrame添加特定列求和行的靠谱方案
我太懂你这种踩坑的感觉了!之前搜的那些方法要么碰到非数值列直接报错,要么好好的整数列被转成浮点数,还有的只能单独处理一列,确实闹心。针对你的需求——只对指定数值列求和,还要保留原数据类型、避开不需要求和的列(比如CountyID),我给你两个实用的解决方案,亲测有效!
方法一:用pd.concat构造总计行(推荐,不修改原数据)
这种方法先单独构建总计行的内容,再和原DataFrame合并,既能精准控制每一列的显示,还能完美保留原数据类型:
import pandas as pd # 你的示例DataFrame df1 = pd.DataFrame( data={ 'CountyID': [77, 95], 'Acronym': ['LC', 'NC'], 'Developable': [44490, 56261], 'Protected': [40355, 35943], 'Developed': [66806, 72211] }, index=['Lehigh', 'Northampton'] ) # 1. 指定需要求和的目标列 sum_columns = ['Developable', 'Protected', 'Developed'] # 2. 构造总计行的数据:自定义非求和列,自动填充求和列的结果 total_row = pd.Series( { 'CountyID': '', # 非求和列可以设为空、'N/A'或者你想要的任意内容 'Acronym': 'TOTAL', **df1[sum_columns].sum().to_dict() # 展开求和结果到对应列 }, name='Total' # 设置总计行的索引名称 ) # 3. 合并原DataFrame和总计行,保留原数据类型 df_with_total = pd.concat([df1, total_row.to_frame().T]) # 查看结果 print(df_with_total)
运行后输出的结果完全符合预期:
Developable/Protected/Developed列的总和是整数,没有被转成浮点数CountyID列留空,Acronym列显示'TOTAL',清晰区分总计行- 原数据的索引和结构都保持完整
方法二:用df.loc直接赋值(更直观,适合快速操作)
如果你不想额外构建新的Series,也可以直接在原DataFrame的副本上添加总计行:
import pandas as pd df1 = pd.DataFrame( data={ 'CountyID': [77, 95], 'Acronym': ['LC', 'NC'], 'Developable': [44490, 56261], 'Protected': [40355, 35943], 'Developed': [66806, 72211] }, index=['Lehigh', 'Northampton'] ) # 先复制原DataFrame,避免修改原始数据 df_with_total = df1.copy() sum_columns = ['Developable', 'Protected', 'Developed'] # 给非求和列设置自定义内容 df_with_total.loc['Total', 'Acronym'] = 'TOTAL' df_with_total.loc['Total', 'CountyID'] = '' # 对指定列求和并赋值,自动保留整数类型 df_with_total.loc['Total', sum_columns] = df1[sum_columns].sum() print(df_with_total)
这个方法的优势是步骤更少,直接在副本上操作,适合临时快速处理数据。
为什么这两种方法能解决你的痛点?
- 避开非数值列报错:我们明确指定了要求和的列,不会让
sum()去处理CountyID或Acronym这类列 - 保留原数据类型:整数列求和后仍然是整数,赋值或合并时不会强制转成浮点数
- 支持多列同时求和:一次就能处理所有目标列,不用逐个列手动赋值
内容的提问来源于stack exchange,提问作者Bowen Liu
相关产品推荐
相关产品推荐

