Pandas系列any()与all()的区别

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

这不奇怪吗?any (沿指定轴返回任何元素是否为True) 和 all (沿指定轴返回所有元素是否为True) 的文档相似,但它们的行为差异似乎没有意义。

为什么会这样呢?


也许它实际上执行的是“没有元素为假”,而不是“所有元素都为真”,而nan使它成为三值逻辑? - jonrsharpe
1
@jonrsharpe,我猜NaN在这种情况下将被完全忽略 - 请检查此内容:pd.Series([]).any()pd.Series([]).all() - MaxU - stand with Ukraine
是的,这很可能是pandas默认处理NaN的问题。 - juanpa.arrivillaga
我无法理解的是为什么 pd.Series([]).all() 返回 True,而 all([]) 也返回 True(我也无法理解这个...) - MaxU - stand with Ukraine
2
找到了一个深入探讨此问题的问题:https://dev59.com/gnA75IYBdhLWcg3weY_u - juanpa.arrivillaga
@juanpa.arrivillaga,感谢您提供的链接! - MaxU - stand with Ukraine
1个回答

3
似乎这是与 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一致。空迭代对于all返回True,对于any返回False这里有一个相关问题。 有趣的是,默认行为似乎与文档不一致:

skipna:布尔型,默认为True 排除NA / null值。如果整行/列都是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
>>> 

@DennisGolomazov 是的,我正要发布那个。 - juanpa.arrivillaga
这似乎是不一致的,skipnaanyall 中默认为 True,所以如果 all 为 True,则 any 也应该为 True,不是吗? - Dennis Golomazov
1
@DennisGolomazov 不,这似乎与内置的anyall一致。对于allany,空迭代器返回TrueFalse。请参阅此处的讨论。 - juanpa.arrivillaga
答案已接受,谢谢!是的,一般我发现pandas文档组织得很差。我倾向于在SO上找到大部分答案,而不是在文档中。 - Dennis Golomazov
1
嘿。是的,这是我最喜欢的一个非常“有用”的pandas文档示例... - juanpa.arrivillaga
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接