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)
另一方面,Pythonany
函数是这样的:
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。