python - 如何求和 Pandas 中的缺失值?

标签 python pandas

我想对 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'))

这让我很惊讶。

编辑:如果我确保 ab 具有相同的行,则生成的 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_valuepd.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/

相关文章:

python - 在数据帧的两列之间进行插值

python - 如何删除两列中具有重复值对的行?

python - 有没有办法确定列表中的元素是否与另一个列表(具有相同索引)的元素匹配?

python - Pandas如何打开里面有表情符号的csv

python - 循环中的 Seaborn 图

python - 批量输入命令输出到变量

python - 如何在matplotlib中设置轴的单位长度?

python - 使用boto3 python计算s3中csv文件的行数

python - 如何有效地将一个 DF 的多列附加到另一个 DF 的一列

python - 在 Python 中使用类和字典来表示二叉树有什么区别?