例如我有一个数据框
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
?
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
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]