如何对含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
相关产品推荐
相关产品推荐

