我想对 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说:
When summing data, NA (missing) values will be treated as zero
这似乎将它们视为 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'))
这让我很惊讶。
编辑:如果我确保 a
和 b
具有相同的行,则生成的 dtype 为 int64
。所以改成float显然只是为了允许NaN值,这有点令人震惊。
编辑 2:修复预期输出中的错误。
最佳答案
文档中的声明指的是减少总和,即:
>>> 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
陷阱,你可以阅读here
根据您的问题描述,即汇总跨列的值计数,您可能想要添加一个fill_value
,pd.Series.add
方法让您可以:
>>> a.add(b, fill_value=0)
1 2.0
3 9.0
4 6.0
dtype: float64
请注意,不幸的是,由于 NaN
,它仍然会进行类型提升。如果这是一个问题,您可以轻松解决它:
>>> a.add(b, fill_value=0).astype(np.int)
1 2
3 9
4 6
dtype: int64
关于python - 如何求和 Pandas 中的缺失值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056567/