熊猫总和两列,跳过NaN

smo*_*aro 25 python pandas

如果我添加两列来创建第三列,那么任何包含NaN(代表我的世界中缺少数据)的列都会导致生成的输出列也是NaN.有没有办法在没有明确地将值设置为0的情况下跳过NaN(这会失去那些值"缺失"的概念)?

In [42]: frame = pd.DataFrame({'a': [1, 2, np.nan], 'b': [3, np.nan, 4]})

In [44]: frame['c'] = frame['a'] + frame['b']

In [45]: frame
Out[45]: 
    a   b   c
0   1   3   4
1   2 NaN NaN
2 NaN   4 NaN
Run Code Online (Sandbox Code Playgroud)

在上面,我希望列c为[4,2,4].

谢谢...

jrj*_*rjc 32

与fillna()

frame['c'] = frame.fillna(0)['a'] + frame.fillna(0)['b']
Run Code Online (Sandbox Code Playgroud)

或按照建议:

frame['c'] = frame.a.fillna(0) + frame.b.fillna(0)
Run Code Online (Sandbox Code Playgroud)

给予:

    a   b  c
0   1   3  4
1   2 NaN  2
2 NaN   4  4
Run Code Online (Sandbox Code Playgroud)

  • 取决于它有多大,做"frame.a.fillna(0)"可能会更好 (2认同)
  • 谢谢.为什么frame.a应优先于frame ['a']?这只是风格偏好吗? (2认同)
  • 使用“frame.a.fillna(0)”或“frame['a'].fillna(0)”可避免在“a”以外的列中填充“NaN”项。 (2认同)

DSM*_*DSM 28

另一种方法:

>>> frame["c"] = frame[["a", "b"]].sum(axis=1)
>>> frame
    a   b  c
0   1   3  4
1   2 NaN  2
2 NaN   4  4
Run Code Online (Sandbox Code Playgroud)

  • 这可能会更好,因为当将两个Nan一起加在一起时,您将得到一个NaN而不是0,如上面的答案所示... (5认同)
  • 是的,它有效地跳过了它们.比较`.mean(axis = 1)` - 第二行(索引1)的平均值为2,而不是1.0的平均值,所以它是跳过NaNs,而不是它的值是0. (4认同)

小智 8

作为上述答案的扩展,doingframe[["a", "b"]].sum(axis=1)会将所有 NaN 的总和填充为 0

>>> frame["c"] = frame[["a", "b"]].sum(axis=1)
>>> frame
    a   b  c
0   1   3  4
1   2 NaN  2
2 NaN   4  4
3 NaN NaN  0
Run Code Online (Sandbox Code Playgroud)

如果您希望所有 NaN 的总和为 NaN,您可以添加文档中引用的 min_count 标志

>>> frame["c"] = frame[["a", "b"]].sum(axis=1, min_count=1)
>>> frame
    a   b  c
0   1   3  4
1   2 NaN  2
2 NaN   4  4
3 NaN NaN  NaN
Run Code Online (Sandbox Code Playgroud)