如何找到哪些列包含任何NaN值在熊猫数据框架

给定一个pandas数据框架,其中包含可能分散在这里和那里的NaN值:

问题:我如何确定哪些列包含NaN值?特别是,我能得到包含nan的列名的列表吗?

352967 次浏览

更新:使用Pandas 0.22.0

更新的Pandas版本有新的方法“DataFrame.isna()”“DataFrame.notna()”

In [71]: df
Out[71]:
a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1


In [72]: df.isna().any()
Out[72]:
a     True
b     True
c    False
dtype: bool

作为列列表:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']

来选择这些列(包含至少一个NaN值):

In [73]: df.loc[:, df.isna().any()]
Out[73]:
a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

旧的回答:

尝试使用isnull ():

In [97]: df
Out[97]:
a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1


In [98]: pd.isnull(df).sum() > 0
Out[98]:
a     True
b     True
c    False
dtype: bool

或者像@root提出的更清晰的版本:

In [5]: df.isnull().any()
Out[5]:
a     True
b     True
c    False
dtype: bool


In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']

选择一个子集——所有列至少包含一个NaN值:

In [31]: df.loc[:, df.isnull().any()]
Out[31]:
a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

你可以使用df.isnull().sum()。它显示了每个特征的所有列和总nan。

我使用这三行代码打印出包含至少一个空值的列名:

for column in dataframe:
if dataframe[column].isnull().any():
print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))

这两种方法都有效:

df.isnull().sum()
df.isna().sum()

DataFrame方法isna()isnull()完全相同。

请注意:空字符串''被认为是False(不被认为是NA)

我有一个问题,我必须有许多列在屏幕上进行视觉检查,所以一个筛选并返回违规列的短列表比较

nan_cols = [i for i in df.columns if df[i].isnull().any()]

如果这对大家有帮助的话

此外,如果您想过滤掉nan值多于阈值的列,那么就使用85%

nan_cols85 = [i for i in df.columns if df[i].isnull().sum() > 0.85*len(data)]

在有大量列的数据集中,最好能看到有多少列包含空值,有多少列不包含空值。

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))


print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))


print("Total no. of columns in the dataframe")
print(len(df.columns))

例如,在我的数据框架中,它包含82列,其中19列包含至少一个空值。

更进一步,你也可以自动删除冒号和行,这取决于哪个有更多的空值
下面是智能执行此操作的代码:

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

注意:上面的代码删除你所有的空值。如果需要空值,请在此之前处理它们。

这对我很有效,

1. 用于获取至少有一个空值的列。(列名称)

data.columns[data.isnull().any()]

2. 用于获取具有count的列,且至少有1个空值。

data[data.columns[data.isnull().any()]].isnull().sum()

< >强(可选) 3.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]

df.isna()返回NaN的真正的值,其余的值。所以,做:

df.isna().any()

将返回True为任何列有NaN, 为其余

df.columns[df.isnull().any()].tolist()

它将返回包含空行的列的名称

这是其中一种方法。

import pandas as pd
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan],'c':[np.nan,2,np.nan], 'd':[np.nan,np.nan,np.nan]})
print(pd.isnull(df).sum())

enter image description here

要查看包含nan的列和包含nan的行:

isnulldf = df.isnull()
columns_containing_nulls = isnulldf.columns[isnulldf.any()]
rows_containing_nulls = df[isnulldf[columns_containing_nulls].any(axis='columns')].index
only_nulls_df = df[columns_containing_nulls].loc[rows_containing_nulls]
print(only_nulls_df)

Features_with_na =[feature用于数据帧中的特征。如果dataframe[features].isnull().sum()>0]

for features_with_na: Print (feature, np.round(dataframe[feature].isnull().mean(), 4), '%缺失值') 打印(features_with_na) < / p >

它将为dataframe中的每一列提供缺失值的%

我知道这是一个很好的回答问题,但我想做一个小小的调整。这个答案只返回包含空值的列,并且仍然显示空值的计数。

1-liner:

pd.isnull(df).sum()[pd.isnull(df).sum() > 0]

描述

  1. 在每一列中计算空值
null_count_ser = pd.isnull(df).sum()
  1. True|False序列,描述该列是否为空
is_null_ser = null_count_ser > 0
  1. 使用T|F系列来过滤那些没有
null_count_ser[is_null_ser]

示例输出

name          5
phone         187
age           644

如果您希望查找包含NaN值的列并获得列名列表,则该代码可以工作。

na_names = df.isnull().any()
list(na_names.where(na_names == True).dropna().index)

如果你想找到值为所有 nan的列,你可以用all替换any