【问题标题】:Why do any() and pd.any() return different values?为什么 any() 和 pd.any() 返回不同的值?
【发布时间】:2020-09-24 07:16:48
【问题描述】:

我最近发现内置函数 any() 不适用于 pandas 数据帧。

import pandas as pd
data = pd.DataFrame([True, False])

print("base: " + str(any(data)))
print("pandas: " + str(data.any()))

结果:

base: False
pandas: 0    True
dtype: bool

有人能解释一下这种行为背后的逻辑吗?

【问题讨论】:

  • any() 的参数应该是可迭代的。

标签: python pandas built-in any


【解决方案1】:

遍历数据框就是遍历其列标签,例如。 g.

In[3]: df = pd.DataFrame({"col_1": [1, 2], "col_2": [3, 4]})
In[4]: df
   col_1  col_2
0      1      3
1      2      4
In[5]: for i in df:
  ...:     print(i)
col_1
col_2

在您的情况下,只有 1 列带有默认标签 0(它是 数字 0,而不是字符串 '0'),您获得了

any(data),

这是

any([0]),

这又是

any([False])

False

【讨论】:

    【解决方案2】:

    查看任何()的文档,它说:

    any(iterable) 如果可迭代的任何元素为真,则返回真。如果可迭代对象为空,则返回 False。相当于:

    def any(iterable):
        for element in iterable:
            if element:
                return True
        return False
    

    如果你这样做:

    for element in data:
        print(element)
    

    它将打印 0。

    此外,如果您执行print(list(data)),您将获得[0] - 即包含一个元素的列表 - 0。

    因此,当您遍历数据框本身(而不是行)时,您会遍历列标签,在这种情况下,您只会得到一个 0,当您执行 any(data) 时,它会被解释为 False

    【讨论】:

    • 也许是个愚蠢的问题,但为什么for element in data: print(element) 返回0?我会把它读作“data 包含的唯一内容是 0”,这没有多大意义。
    • 查看@MarianD 的回答
    • @annhak 就像遍历字典返回键而不是值一样,遍历数据框返回标签,而不是内容。
    • @annhak 这就是为什么 pandas 有像.iterrows()这样的方法
    • 所以,基本的python。问:“我的 df 是否包含任何 True 值?”答:“您可以通过这 3 种不同的方法找出答案,但它们的工作方式都不同,如果您不小心,答案将是 'False is not True' - 基本上有效,但不能回答问题”跨度>
    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多