了解Pandas中的任何()和nan

job*_*ers 1 python nan pandas

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

In [88]: pd.Series([False, np.nan]).any()
Out[88]: nan
Run Code Online (Sandbox Code Playgroud)

在哪里:

In [84]: np.any([False, np.nan]) 
Out[84]: True
Run Code Online (Sandbox Code Playgroud)

并且:

In [99]: pd.DataFrame([False, np.nan]).any()
Out[99]: 
0    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 5

这里的区别与实现any不同的两种不同类型无关.事实上,文档pandas.Series.anynumpy.ndarray.any两者明确地说"参考numpy.any完整文档",因为它们都有效地调用numpy.any.

不同的是,在这两种情况下你有不同的dtypes.如果可能,从不同的数字类型隐式或显式地创建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
Run Code Online (Sandbox Code Playgroud)