如何在Pandas DataFrame中将非NaN值替换为对应列和(排除前两列)
Pandas替换非NaN值为对应列和的解决方案
问题场景
给定如下Pandas DataFrame:
import pandas as pd data = {'Org': ['Tom', 'Kelly', 'Rick', 'Dave','Sara','Liz'], 'A': ['NaN', 1, 1, 1, 'NaN', 'NaN'], 'B': [1, 1, 1, 1, 'NaN', 1], 'C': [1, 1, 1, 1, 1, 1], 'D': ['NaN', 'NaN', 1, 'NaN', 1, 'NaN'], 'E': [1, 1, 1, 1, 'NaN', 1], 'F': ['NaN', 1, 1, 1, 'NaN', 1]} df = pd.DataFrame(data)
需求:对除前两列外的所有列计算列和,将这些列中的非NaN值替换为对应列的求和结果,保留原有的NaN值。
用户原尝试代码会直接替换整列值,无法保留NaN:
column_sums = df.iloc[:, 2:].sum() for column in iloc[:, 2:].columns: df[column] = column_sums[column]
流畅解决方案
步骤1:转换字符串类型的NaN为真正的缺失值
原始数据中的'NaN'是字符串,会干扰求和计算,先转换为Pandas可识别的缺失值:
import numpy as np df = df.replace('NaN', np.nan)
步骤2:计算目标列的求和值
选取从第3列开始的所有列,计算每列的和:
target_cols = df.columns[2:] col_sums = df[target_cols].sum()
步骤3:替换非缺失值为对应列和
使用Pandas矢量化操作mask,仅将非NaN的位置替换为列和,保留原缺失值:
df[target_cols] = df[target_cols].mask(df[target_cols].notna(), col_sums)
最终结果
处理后的DataFrame与预期一致:
# 输出结果 print(df) # Org A B C D E F # 0 Tom NaN 5.0 6 NaN 5.0 NaN # 1 Kelly 3.0 5.0 6 NaN 5.0 4.0 # 2 Rick 3.0 5.0 6 2.0 5.0 4.0 # 3 Dave 3.0 5.0 6 NaN 5.0 4.0 # 4 Sara NaN NaN 6 2.0 NaN NaN # 5 Liz NaN 5.0 6 NaN 5.0 4.0
方案优势
- 避免循环,利用Pandas矢量化操作提升效率
- 精准控制替换范围,仅修改非缺失值,保留原始缺失数据
- 代码简洁易读,符合Pandas最佳实践
内容的提问来源于stack exchange,提问作者hadji
相关产品推荐
相关产品推荐

