Pandas 数据框列减法,处理 NaN

问题描述 投票:0回答:2

例如我有一个数据框

df = pd.DataFrame([(np.nan, .32), (.01, np.nan), (np.nan, np.nan), (.21, .18)],
                  columns=['A', 'B'])
        A   B
0   NaN     0.32
1   0.01    NaN
2   NaN     NaN
3   0.21    0.18

我想从

B
 中减去 
A

df['diff'] = df['A'] - df['B']

    A     B      diff
0   NaN   0.32   NaN
1   0.01  NaN    NaN
2   NaN   NaN    NaN
3   0.21  0.18   0.03
如果其中一列是

NaN

,则
Difference 返回 NaN。为了克服这个问题,我使用
fillna

df['diff'] = df['A'].fillna(0) - df['B'].fillna(0)

    A     B      diff
0   NaN   0.32   -0.32
1   0.01  NaN    0.01
2   NaN   NaN    0.00
3   0.21  0.18   0.03

这解决了 diff 列中的

NaN
问题,但对于索引 2,结果为
0
,而我希望差异为
NaN
,因为 A 列和 B 列是
NaN

如果两列都是 NaN,有没有办法明确告诉 pandas 输出

NaN

python pandas dataframe
2个回答
7
投票

Series.sub
fill_value=0
参数一起使用:

df['diff'] = df['A'].sub(df['B'], fill_value=0)
print (df)
      A     B  diff
0   NaN  0.32 -0.32
1  0.01   NaN  0.01
2   NaN   NaN   NaN
3  0.21  0.18  0.03

如果需要将 NaN 替换为

0
添加
Series.fillna
:

df['diff'] = df['A'].sub(df['B'], fill_value=0).fillna(0)
print (df)
      A     B  diff
0   NaN  0.32 -0.32
1  0.01   NaN  0.01
2   NaN   NaN  0.00
3  0.21  0.18  0.03

0
投票
def subtract_float_columns_simple(df, A, B):
    # Convert columns to float, set invalid parsing to NaN
    df[A] = pd.to_numeric(df[A], errors='coerce')
    df[B] = pd.to_numeric(df[B], errors='coerce')

    # Subtract the columns, NaN will be propagated automatically
    return df[B] - df[A]
© www.soinside.com 2019 - 2024. All rights reserved.