熊猫系列 any() vs all()

Posted

技术标签:

【中文标题】熊猫系列 any() vs all()【英文标题】:Pandas Series any() vs all() 【发布时间】:2017-02-24 10:11:01 【问题描述】:
>>> s = pd.Series([float('nan')])
>>> s.any()
False
>>> s.all()
True

这不是很奇怪吗? any(返回是否有任何元素在请求的轴上为真)和all(返回是否所有元素在请求的轴上为真)的文档相似,但行为上的差异对我来说似乎没有意义。

什么给了?

【问题讨论】:

也许它实际上是在做 "no elements are false",而不是 "all elements are true",而nan 使它成为三个-重视逻辑? @jonrsharpe,我猜在这种情况下 NaN 将被完全忽略 - 检查:pd.Series([]).any()pd.Series([]).all() 是的,这可能是 pandas 默认处理 NaN 的问题。 我无法理解的是为什么:pd.Series([]).all()Trueall([]) 也返回True(我也无法理解这个......)跨度> 发现了这个深入研究的问题:***.com/questions/3275058/… 【参考方案1】:

这似乎是pandas 通常忽略NaN 的问题,除非被告知不要这样做:

>>> pd.Series([float('nan')]).any()
False
>>> pd.Series([float('nan')]).all()
True
>>> pd.Series([float('nan')]).any(skipna=False)
True
>>> 

注意,NaN 是假的:

>>> bool(float('nan'))
True

另请注意:这与内置的anyall 一致。空的可迭代对象返回 True 用于 allFalse 用于 any。 Here is a relevant question on that topic.

有趣的是,默认行为似乎与文档不一致:

skipna : 布尔值,默认 True 排除 NA/空值。如果整行/列为 NA,则结果 不适用

但请注意:

>>> pd.Series([float('nan')]).any(skipna=None)
False
>>> pd.Series([float('nan')]).any(skipna=True)
False
>>> pd.Series([float('nan')]).any(skipna=False)
True
>>> 

【讨论】:

文档中关于skipna 的内容如下:Exclude NA/null values. If an entire row/column is NA, the result will be NA。而且它不会那样工作:pd.Series([float('nan')]).any() 返回False,而不是NA @DennisGolomazov 是的,我正要发布那个。 这似乎是不一致的,skipnaanyall 中默认为 True,所以如果 all 为 True,any 也应该为 True,不应该是吗? @DennisGolomazov 不,它似乎与内置的anyall 一致。空的可迭代对象返回 True 用于 allFalse 用于 any。见讨论here 嘿。是的,this 是我最喜欢的一个非常“有用”的 pandas 文档示例......

以上是关于熊猫系列 any() vs all()的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是在熊猫数据框中

熊猫日期时间格式 VS 谷歌表格日期格式

熊猫:SettingWithCopyWarning [重复]

基于索引从大熊猫系列列表中提取到另一个大熊猫系列

熊猫系列浮动指数

迭代熊猫系列元素的最佳方法