【问题标题】:Pandas sum two columns, skipping NaNPandas 将两列相加,跳过 NaN
【发布时间】:2014-06-24 12:27:19
【问题描述】:

如果我添加两列来创建第三列,任何包含 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

在上面,我希望 c 列是 [4, 2, 4]。

谢谢...

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用 fillna()

    frame['c'] = frame.fillna(0)['a'] + frame.fillna(0)['b']
    

    或按照建议:

    frame['c'] = frame.a.fillna(0) + frame.b.fillna(0)
    

    给予:

        a   b  c
    0   1   3  4
    1   2 NaN  2
    2 NaN   4  4
    

    【讨论】:

    • 取决于它有多大,改用frame.a.fillna(0) 可能会更好
    • 谢谢。为什么 frame.a 比 frame['a'] 更受欢迎?只是风格偏好吗?
    【解决方案2】:

    另一种方法:

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

    【讨论】:

    • sum() 会自动执行 fillna(0) 还是跳过 NaN?
    • 是的,它有效地跳过了它们。比较.mean(axis=1)——第二行(索引 1)的平均值为 2,而不是平均值 1.0,所以它跳过了 NaN,而不是估算值 0。
    • 这可能会更好,因为当将两个 Nan 加在一起时,您将得到一个 NaN,而不是 0,如上面的答案...
    • 我使用的是 pandas 1.0.5,它确实将 2 个 Nans 加起来为 0
    • 这是更好的答案,请参阅documentationskipna 参数
    【解决方案3】:

    作为对上述答案的扩展,执行frame[["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
    

    如果您希望所有 NaN 的总和为 NaN,您可以添加 docs 中引用的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 2017-01-01
      • 2019-11-28
      • 2021-04-18
      • 2012-10-13
      • 1970-01-01
      • 2021-01-03
      • 2014-12-01
      相关资源
      最近更新 更多