Python 当不存在NAN时,any(df.isna())返回true

Python 当不存在NAN时,any(df.isna())返回true,python,pandas,dataframe,Python,Pandas,Dataframe,当我创建一个浮点数据帧并执行any(df.isna())时,无论数组的内容如何,它总是返回True。我希望这会给出与df.isna().any().any()相同的结果。。我错过了什么 import pandas as pd import numpy as np import sys print(f'Pandas version {pd.__version__}') print(f'Numpy version {np.__version__}') print(f'Python version:

当我创建一个浮点数据帧并执行
any(df.isna())
时,无论数组的内容如何,它总是返回True。我希望这会给出与df.isna().any().any()相同的结果。。我错过了什么

import pandas as pd
import numpy as np
import sys
print(f'Pandas version {pd.__version__}')
print(f'Numpy version {np.__version__}')
print(f'Python version: {sys.version}')
df = pd.DataFrame(np.random.random((5, 3)))
print(f'The DataFrame:\n{df}')
print(f'Result of any(df.isna()): {any(df.isna())}')
print(f'Result of df.isna().any().any(): {df.isna().any().any()}')
产出:

Pandas version 1.1.4
Numpy version 1.19.4
Python version: 3.7.8 | packaged by conda-forge | (default, Nov 27 2020, 18:48:03) [MSC v.1916 64 bit (AMD64)]
The DataFrame:
          0         1         2
0  0.972085  0.418991  0.736300
1  0.603018  0.280435  0.981732
2  0.376201  0.343994  0.026125
3  0.002652  0.683785  0.729332
4  0.759530  0.792976  0.436991
Result of any(df.isna()): True
Result of df.isna().any().any(): False

原因是df.isna()是一个数据帧。当您迭代一个数据帧时,实际上是在迭代列名:

for x in df.isna():
    print(x)
另一方面,Python
any
函数是这样的:

def anyPython(iterable):

    for x in iterable:
        if bool(x): return True

    return False
当您执行
bool('some string')
时会发生什么?

任何
数据帧
对象 获得此输出的原因是,如果iterable的任何元素被计算为
True
,则
any
返回
True
,否则
False
,并且被视为iterable的
数据帧将提供其列名。任何非空的
str
计算结果为
True
,任何非零的
int
将计算结果为
True
——如您给定的示例所示——因此
任何
都按预期进行操作

要根据
df
中包含的值获得预期输出(
True
如果iterable的任何元素被评估为
True
否则
False
),可以使用以下任一示例

df.isna().values.any()#示例1
任何(df.isna().values.flatte())35;示例2
使用
isdf.isna().values
返回一个
numpy.ndarray
,其中包含
df.na()
的值,然后在两个不同的
函数中使用

第一个示例说明 给出的第一个示例使用而不是
numpy。如果
kwarg为
None
(默认值),则any
计算给定
ndarray
所有维度的所有元素

第二个示例说明 在第二个示例中使用的原因是
df.values
将返回多维
ndarray
,并且当
any(args)
对传递的iterable执行元素检查时,您将在运行时引发以下错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
展平
完全按照它听起来的方式进行-将多维
ndarray
的值映射到一维-可以使用
any(您的\u flat\u数组)对其进行适当的迭代和评估。


我觉得在这里解释这两种方法之间的差异是恰当的,尽管为什么选择第二种方法对我来说是个谜。

我相信原因是任何()函数都不需要df,可以使用列表、元组或dict。例如,尝试堆叠df的元素并将它们转换为ist。然后您将得到任何(df.isna().stack().tolist())一个False。