1

我有同样的问题:Pandas series.all() returns nan

In [88]: pd.Series([False, np.nan]).any()
Out[88]: nan

然而:

In [84]: np.any([False, np.nan]) 
Out[84]: True

并且:

In [99]: pd.DataFrame([False, np.nan]).any()
Out[99]: 
0    False
dtype: bool

我很好奇这三种类型的不同行为的解释是什么?

4

1 回答 1

5

这里的区别与两种不同类型的实现方式无关any。事实上,文档pandas.Series.anynumpy.ndarray.any两者都明确表示“参考numpy.any完整文档”,因为它们实际上都只是调用numpy.any.

不同之处在于您在这两种情况下具有不同的 dtype。如果可能,从不同的数字类型隐式或显式创建 NumPy ndarray 会强制类型相同,因此您最终得到float64,而 Pandas 系列将类型分开,这意味着您最终得到object.

如果你明确指定dtype,你可以看到他们做同样的事情:

>>> a = np.array([False, np.nan])
>>> a
array([  0., nan])
>>> a.dtype
float64
>>> a.any()
True
>>> a = np.array([False, np.nan], dtype=object)
>>> a
array([False, nan], dtype=object)
>>> a.any()
nan
>>> p = pd.Series([False, np.nan])
>>> p
0    False
1      NaN
>>> p.dtype
dtype('O')
>>> p.any()
nan
>>> p = pd.Series([False, np.nan], dtype=np.float64)
>>> p
0     0
1   NaN
>>> p.any()
True
于 2013-11-12T05:00:52.310 回答