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

如何对含NaN值的pandas DataFrame求和并保留有效值(0+NaN=0)

解决pandas DataFrame含NaN值的求和需求(0+NaN=0)

要实现你需要的求和逻辑——0与NaN相加结果为0,仅当对应位置所有值都是NaN时保留NaN,可以按以下步骤操作:

步骤1:对齐两个DataFrame的列名

首先确保两个DataFrame的列名一致,这样才能按对应列进行运算:

import pandas as pd
import numpy as np

# 创建示例DF1
df1 = pd.DataFrame({
    'A1': [0, 0],
    'B1': [0, 1],
    'C1': [np.nan, 1],
    'D1': [np.nan, np.nan]
})

# 创建示例DF2
df2 = pd.DataFrame({
    'A2': [np.nan, np.nan],
    'B2': [np.nan, 1],
    'C2': [np.nan, 1],
    'D2': [np.nan, 1]
})

# 将DF2的列名改为和DF1一致
df2.columns = df1.columns

步骤2:带填充的求和运算

使用add()方法,并设置fill_value=0,这样NaN会被当作0参与计算:

sum_temp = df1.add(df2, fill_value=0)

步骤3:还原全NaN的位置

上面的步骤会把两个NaN相加的结果变成0,但我们需要保留这些位置为NaN,所以需要找出两个DataFrame中对应位置都为NaN的区域,再将结果中的这些位置重置为NaN:

# 找出两个DF对应位置都为NaN的布尔矩阵
both_nan = df1.isna() & df2.isna()
# 用mask方法将全NaN位置重置为NaN
sum_df = sum_temp.mask(both_nan)

步骤4:重命名结果列(可选)

如果需要将列名改为你预期的"A sum"格式:

sum_df.columns = [col.replace('1', ' sum') for col in sum_df.columns]

最终结果

运行后得到的sum_df就是你要的预期输出:

A sum  B sum  C sum  D sum
0    0.0    0.0    NaN    NaN
1    0.0    2.0    2.0    1.0

内容的提问来源于stack exchange,提问作者blackcat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:15:38