涉及nan的数据帧操作

时间:2016-07-31 04:39:42

标签: python numpy pandas

我想从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]

我该怎么做?

1 个答案:

答案 0 :(得分:3)

  

我希望如果其中任何一个值不是nan,则减法应该继续将nan值设为0.如果两者都不是nan,则结果应该是差异。

使用fillnanan - 值设置为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]

From the docs

  

fill_value:无或浮点值,默认为无(NaN)       使用此值填充缺失(NaN)值。如果两个系列都是       缺少,结果将丢失