我想从Dataframe中的所有行中减去带有nan值的行。为此,我正在使用
dataframe.sub(row, axis= 1)
这忽略了nan值,即如果两行中的任何一个值为nan,则结果为nan。我希望如果其中任何一个值不是nan,则减法应该继续将nan值设为0.如果两者都不是nan,则结果应该是差异。如果两者都是nan,则结果应该是nan。例如,减去以下两行应如下所示,
[1, 2, nan, nan, 5] - [nan, 5, 1, nan, 2] = [1 , -3, -1, nan, 3]
我该怎么做?
答案 0 :(得分:3)
我希望如果其中任何一个值不是nan,则减法应该继续将nan值设为0.如果两者都不是nan,则结果应该是差异。
使用fillna
将nan
- 值设置为0,然后应用掩码将结果重置为nan
,其中两个输入值均为nan
。
import pandas as pd
import numpy as np
# sample data
nan = np.nan
df = pd.DataFrame({ 'a': [1, 2, nan, nan, 5],
'b': [nan, 5, 1, nan, 2] })
# get all rows with both values nan
nan_mask = df.a.isnull() & df.b.isnull()
# calculate with all nans set to 0
result = df.a.fillna(0) - df.b.fillna(0)
# set rows with both nans to nan
result[nan_mask] = nan
print list(result)
=> [1.0, -3.0, -1.0, nan, 3.0]
<强>更新强>
如果您正在寻找更简洁的解决方案,事实证明df.sub(other, fill_value=0.0)
实现了同样的目标:
df = pd.DataFrame({ 'a': [1, 2, nan, nan, 5],
'b': [nan, 5, 1, nan, 2]})
result = df.a.sub(df.b, fill_value=0.0)
=> [1.0, -3.0, -1.0, nan, 3.0]
fill_value:无或浮点值,默认为无(NaN) 使用此值填充缺失(NaN)值。如果两个系列都是 缺少,结果将丢失