You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:21:36