在Python Pandas中,检查DataFrame是否具有一个(或多个)NaN值的最佳方法是什么?
我知道函数pd.isnan,但这会为每个元素返回一个布尔数据框架。 这篇文章也没有完全回答我的问题。
查看大熊猫中丢失数据计数的摘要
最新版本的pandas(v0.23.2)允许用户在没有任何调用(any().any())的情况下对两个轴执行逻辑缩减。 有关详情,请参阅此答案。
jwilner的回应是现货。我正在探索是否有更快的选择,因为根据我的经验,求平面阵列(奇怪地)比计数更快。这段代码似乎更快:
df.isnull().values.any()
例如:
In [2]: df = pd.DataFrame(np.random.randn(1000,1000))
In [3]: df[df > 0.9] = pd.np.nan
In [4]: %timeit df.isnull().any().any()
100 loops, best of 3: 14.7 ms per loop
In [5]: %timeit df.isnull().values.sum()
100 loops, best of 3: 2.15 ms per loop
In [6]: %timeit df.isnull().sum().sum()
100 loops, best of 3: 18 ms per loop
In [7]: %timeit df.isnull().values.any()
1000 loops, best of 3: 948 μs per loop
df.isnull().sum().sum()有点慢,但当然还有其他信息 - NaNs的数量。
感谢您抽出时间基准。令人惊讶的是pandas没有内置功能。从@JGreenwells的帖子中可以看出df.describe()可以做到这一点,但没有直接的功能。
我只是df.describe()(没有找到NaN s)。使用1000 x 1000阵列,单个呼叫需要1.15秒。
:1,此外,df.isnull().values.sum()比df.isnull().values.flatten().sum()快一点
啊,很好的捕获@JohnGalt - 我改变我的解决方案,删除.flatten()的postering。谢谢。
你没有尝试df.isnull().values.any(),对我来说它比其他人快。
我同意@ CK1。对我来说,df.isnull().values.any()比df.isnull().values.sum()(1.4毫秒)快两倍(0.7毫秒)
np.isnan(df.values).any()工作得快一点,但它对于对象dtype不起作用
df.shape[1] - df.dropna(axis = 1).shape[1]会快速确认在整个数据帧中有多少列具有空值
你有几个选择。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,6))
# Make a few areas have NaN values
df.iloc[1:3,1] = np.nan
df.iloc[5,3] = np.nan
df.iloc[7:9,5] = np.nan
现在数据框看起来像这样&#x