【问题标题】:How to sum with missing values in Pandas?如何对 Pandas 中的缺失值求和?
【发布时间】:2018-03-02 02:54:04
【问题描述】:

我想对 Pandas Series 对象求和,但得到的奇怪结果似乎不是文档所说的那样。

在 Pandas 0.19.2 中,以下代码:

a = pd.Series({1: 2, 3: 4})
b = pd.Series({3: 5, 4: 6})
print(a + b)

给我,

1    NaN
3    9.0
4    NaN
dtype: float64

但是,documentation 说:

对数据求和时,NA(缺失)值将被视为零

这似乎将它们视为 NaN 而不是零。我期待输出:

1    2.0
3    9.0
4    6.0
dtype: float64

在我的情况下,系列来自value_counts() 的多个列,我想使用sum(),但它为所有列中没有值的所有行提供了 NaN,这是错误的。每行都应该有一个整数。

对我来说另一个谜团是为什么结果有 dtype float:

a.dtype, b.dtype, (a+b).dtype

给予,

(dtype('int64'), dtype('int64'), dtype('float64'))

这让我很惊讶。

编辑:如果我确保 ab 具有相同的行,则生成的 dtype 为 int64。所以改成float显然只是为了允许NaN值,这有点令人震惊。

编辑 2:修复预期输出中的错误。

【问题讨论】:

  • 问题不是缺失值,而是索引不匹配。 pandas 数据结构的重点是自动索引对齐。
  • 是的,我明白这一点,但我想将缺失的索引视为缺失值,文档说它们应该被视为零。这是 Pandas 中的错误还是文档中的错误?
  • “当对数据求和时,NA(缺失)值将被视为零”正在谈论sum方法。
  • 您还可以查看如何估算缺失数据。
  • > '"对数据求和时,NA(缺失)值将被视为零"是在谈论求和方法。'所以这不适用于+ 运营商?所以我不能将它与 Python sum() 方法一起使用? (ps.,这是一个答案。为什么在我提出的每一个问题上,人们都坚持将答案放在 cmets 中?)

标签: python pandas


【解决方案1】:

文档中的声明是指减少总和,即:

>>> a + b
1    NaN
3    9.0
4    NaN
dtype: float64
>>> (a + b).sum()
9.0 # nans treated as zero...

不是向量化的总和。你必须明确地这样做:

>>> (a + b).fillna(0)
1    0.0
3    9.0
4    0.0
dtype: float64

至于升级到float,这是常见的pandas gotcha,你可以阅读here

鉴于您的问题描述,即跨列汇总值计数,您可能想要在添加中添加 fill_valuepd.Series.add 方法可以让您这样做:

>>> a.add(b, fill_value=0)
1    2.0
3    9.0
4    6.0
dtype: float64

请注意,不幸的是,由于NaNs,它仍然会进行类型提升。如果这是一个问题,您可以轻松解决它:

>>> a.add(b, fill_value=0).astype(np.int)
1    2
3    9
4    6
dtype: int64

【讨论】:

  • 我的问题搞错了!对不起。我打算写最后一部分。 fill_value 是我想要的,谢谢。
  • 你能补充你的答案吗,有没有更好的方法,a.add(b..).add(c..) 等等?这一点是使用 sum() 处理多个系列的求和,即避免循环。
  • @Steve 我不确定您到底要做什么。如果您添加一个示例,这将有助于澄清。如果你的意思是你使用的是内置的sum,那么你可能应该做一个循环。
  • 也就是说,我有一个列表 [b,c,d,e...],而不是 b。无论如何,我可以用 reduce 来做到这一点,但它不如 sum(): total = reduce(lambda x,y: x.add(y,fill_value=0).astype(int), counts.values() )
  • @Steve 我只会使用 for 循环...但 reduce 有效。
猜你喜欢
  • 2021-08-02
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
相关资源
最近更新 更多