使用Python Pandas对行求和时返回NaN的问题如何调试解决?
问题根因
- 列索引对齐不匹配:
concat_list[['Bases','Chambers']].sum()返回的Series仅包含Bases、Chambers两个列索引,直接给concat_list.loc['Total']赋值时,Pandas会按列名匹配整表的所有列(包含Title、Netquantity),未匹配到的列会默认填充NaN。如果列数据类型存在不兼容,甚至Bases、Chambers两列也会返回NaN。 - 列数据类型异常:如果
Bases、Chambers列为object/字符串类型,表中的空值可能是空字符串而非NaN,fillna(0)无法处理这类空值,求和操作返回的结果本身就是NaN,赋值后自然全为空。
解决步骤
1. 修正数据类型与空值处理
先验证列数据类型,再做统一转换:
# 查看各列数据类型 print(concat_list.dtypes) # 将目标列转为数值类型,无法转换的内容统一置为NaN concat_list['Bases'] = pd.to_numeric(concat_list['Bases'], errors='coerce') concat_list['Chambers'] = pd.to_numeric(concat_list['Chambers'], errors='coerce') # 填充所有空值为0 concat_list = concat_list.fillna(0) # 验证空值是否全部处理完成 print(concat_list.isna().sum())
2. 正确赋值合计行
方案1:仅给目标列赋值合计
直接指定合计行的对应列,避免索引对齐问题:
concat_list.loc['Total', ['Bases','Chambers']] = concat_list[['Bases','Chambers']].sum()
方案2:构造完整合计行赋值
如果需要给其他列也填充指定内容,可手动构造完整的行数据再赋值:
total_row = pd.Series({ 'Title': 'Total', 'Netquantity': concat_list['Netquantity'].sum(), 'Bases': concat_list['Bases'].sum(), 'Chambers': concat_list['Chambers'].sum() }) concat_list.loc['Total'] = total_row
调试验证
执行求和操作后先打印中间结果,确认求和逻辑正常:print(concat_list[['Bases','Chambers']].sum())
如果返回结果是预期的数值,再执行赋值操作即可。
内容的提问来源于stack exchange,提问作者Samuel Saerang
相关产品推荐
相关产品推荐

