Pandas合并DataFrame求和:排除Fecha与hours列生成空值总计行
解决Pandas总计行中指定列留空的问题
嗨,我明白你的问题了——当前的总计行把Fecha和hours列的字符串都拼接起来了,这肯定不是你想要的效果。咱们来修改代码,让这两列在总计行显示为空值,只对数值列求和。
问题根源
原代码里的result.loc['Total']= result.sum()会对所有列执行求和操作:对于数值列(比如impressions、revenue)是正常求和,但对于字符串列(Fecha、hours),Pandas的sum()方法会把所有字符串拼接在一起,这就是你看到一堆乱码的原因。
修改后的完整代码
import pandas as pd import os # 读取并合并数据 df = pd.read_csv('a_AR.csv') df1 = pd.read_csv('a_US.csv') result = pd.concat([df1, df]).sort_values(by=['Fecha','hours']) # 删除不需要的列 del result['eCPM'] del result['Importe_a_pagar_a_medio'] # 构建总计行:数值列求和,指定列留空 # 自动筛选所有数值类型的列 numeric_cols = result.select_dtypes(include=['int64', 'float64']).columns total_values = result[numeric_cols].sum() # 创建总计行的Series,先初始化所有列,再赋值 total_row = pd.Series(index=result.columns) total_row[numeric_cols] = total_values # 把Fecha和hours列设为空值(pd.NA是Pandas推荐的缺失值标记) total_row[['Fecha', 'hours']] = pd.NA # 将总计行添加到DataFrame末尾 result = pd.concat([result, total_row.to_frame().T], ignore_index=True) # 保存并清理文件 result.to_csv('a_AR-US_Days_hours.csv', index=False) os.remove('a_US.csv') os.remove('a_AR.csv')
效果说明
修改后你的输出会变成这样:
Fecha,hours,impressions,revenue
22/01/2018,23hs,1666,0.73
22/01/2018,23hs,67,0.02
,,1733,0.75
(空值在CSV里会显示为逗号之间的空白,完全符合你的需求)
额外说明
- 用
select_dtypes自动筛选数值列的好处是:如果以后你的数据新增了其他数值列,代码不需要手动修改就能自动求和。 pd.NA是Pandas 1.0+版本推荐的缺失值表示,如果你用的是旧版本,可以换成np.nan(需要提前导入numpy)。
内容的提问来源于stack exchange,提问作者Martin Bouhier
相关产品推荐
相关产品推荐

