我想总结一下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'))
这让我很惊讶。
编辑:如果我确保a
和b
具有相同的行,则生成的dtype是int64
。所以浮动的变化显然只是为了允许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
s,它仍然会进行类型提升。如果是一个问题,您可以轻松解决它:
>>> a.add(b, fill_value=0).astype(np.int)
1 2
3 9
4 6
dtype: int64