如何在pandas DataFrame中计算一列中的NaN值数量?

788
我想要找到我的数据中每一列的 NaN 数量。

我正在搜索“如何计算列中的NaN值”,但实际上答案是针对“我想找到数据每列中NaN的数量”。幸运的是,其中一条评论提供了答案。典型的“标题与正文不符,因此答案也不符合标题”。 - mins
1
@Rishabh 注意,df.info()不会返回一个DataFrame,该方法只是打印信息。 - joris
1
谢谢@joris - 只需简单的df.info()即可提供每列的数据类型和非空计数。 - Rishabh
32个回答

1103

使用isna()方法(或其别名isnull(),适用于早期的pandas版本<0.21.0),然后求和计算NaN值。对于单列数据:

>>> s = pd.Series([1,2,3, np.nan, np.nan])

>>> s.isna().sum()   # or s.isnull().sum() for older pandas versions
2

对于多列,这也适用:

>>> df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})

>>> df.isna().sum()
a    1
b    2
dtype: int64

68
如果你想要获取整个数据框 df 中所有缺失值的总数,可以使用 df.isnull().sum().sum() - JakeCowton
8
获取列和,使用.sum(axis=0),这是默认行为。获取行和,使用.sum(axis=1) - smci
3
@RockJake28 或者 df.isnull().values.sum() - cs95
29
如果有人想知道的话,df['column_name'].isna().sum() 也能起作用。 - Superdooperhero
4
"然后求和计算NaN值". 要理解这个语句,需要了解df.isna()生成布尔系列,其中True的数量就是NaN的数量,而df.isna().sum()FalseTrue相加,分别用0和1替换它们。因此,这间接地计算了NaN,而简单的count只会返回列的长度。 - mins
显示剩余2条评论

166
假设 df 是一个 Pandas DataFrame。
那么,
df.isnull().sum(axis = 0)

这将给出每列中NaN值的数量。

如果您需要每行中的NaN值,

df.isnull().sum(axis = 1)

132
你可以将非NaN值的count减去总长度:
count_nan = len(df) - df.count()

你应该在你的数据上计时。对于小系列,与isnull解决方案相比,速度提高了3倍。


8
确实,最好是这样做。我认为这取决于框架的大小,对于较大的框架(3000行),使用 isnull 已经比这个快了两倍。 - joris
10
在一个需要对一个巨大的分组进行计数,并且通常情况下该分组的大小小于4的情况下,我尝试了两种方式。其中,在0.17.1版本中,Joris提供的df.isnull().sum() 方法至少比另一种方法快20倍。 - Nathan Lloyd
对我来说,两者在70,000行中的平均值都不到3毫秒,并且几乎没有NA值。 - Josiah Yoder

72

根据得票最多的答案,我们可以轻松定义一个函数,该函数给出一个数据框以预览每列中缺失值的情况和缺失值的百分比:

def missing_values_table(df):
    mis_val = df.isnull().sum()
    mis_val_percent = 100 * df.isnull().sum() / len(df)
    mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)
    mis_val_table_ren_columns = mis_val_table.rename(
    columns = {0 : 'Missing Values', 1 : '% of Total Values'})
    mis_val_table_ren_columns = mis_val_table_ren_columns[
        mis_val_table_ren_columns.iloc[:,1] != 0].sort_values(
    '% of Total Values', ascending=False).round(1)
    print ("Your selected dataframe has " + str(df.shape[1]) + " columns.\n"      
        "There are " + str(mis_val_table_ren_columns.shape[0]) +
            " columns that have missing values.")
    return mis_val_table_ren_columns

3
类似 df.stb.missing() 这样的功能?你需要导入 sidetable 模块才能使用! - shantanuo
这太棒了。 - max

44

自从pandas 0.14.1版本起,我在这里建议增加一个关键参数以便于使用value_counts方法已被实现:

import pandas as pd
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})
for col in df:
    print df[col].value_counts(dropna=False)

2     1
 1     1
NaN    1
dtype: int64
NaN    2
 1     1
dtype: int64

到目前为止,这是最好的答案,它允许计算其他值类型。 - gaborous

26

如果只是在Pandas列中计算NaN值,这里有一个快速的方法:

import pandas as pd
## df1 as an example data frame 
## col1 name of column for which you want to calculate the nan values
sum(pd.isnull(df1['col1']))

3
Sushmit,如果你有多个列需要处理,这种方法可能不太快。在这种情况下,你必须复制粘贴或手动输入每个列名,然后重新执行代码。 - Amos Long

25

df.isnull().sum()会给出每一列缺失值的总和。

如果您想知道特定列中缺失值的总和,则可以使用以下代码:df.column.isnull().sum()


25

以下内容将按降序打印所有NaN列。

df.isnull().sum().sort_values(ascending = False)
下面将按降序打印前15个Nan列。
df.isnull().sum().sort_values(ascending = False).head(15)

22
df.isnull().sum() 
      //type: <class 'pandas.core.series.Series'>
或者
df.column_name.isnull().sum()
     //type: <type 'numpy.int64'>

20

如果您正在使用Jupyter Notebook,那么怎么样......

 %%timeit
 df.isnull().any().any()
或者
 %timeit 
 df.isnull().values.sum()

数据中是否存在NaN,如果有,位置在哪里?

 df.isnull().any()

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