如何在Pandas数据帧(python)中查找哪些列包含任何NaN值

时间:2016-03-25 18:50:37

标签: python pandas numpy dataframe nan

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

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

谢谢

12 个答案:

答案 0 :(得分:155)

更新:使用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

OLD回答:

尝试使用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

答案 1 :(得分:19)

您可以使用df.isnull().sum()。它显示了每个要素的所有列和总NaN。

答案 2 :(得分:3)

我有一个问题,我不得不在屏幕上目视检查许多列,因此筛选和返回有问题的列的简短列表组合是

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

如果这对任何人都有帮助

答案 3 :(得分:3)

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

返回包含空行的列名

答案 4 :(得分:3)

这是其中一种方法..

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

答案 5 :(得分:2)

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

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.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1,inplace = True)
df.dropna(axis = 0,inplace = True)

注意:上面的代码删除了所有空值。如果需要空值,请先处理它们。

答案 6 :(得分:2)

这对我有用,

1。为了获得具有至少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]

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

这两个都应该起作用:

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

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

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

答案 9 :(得分:0)

只查看包含 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)

答案 10 :(得分:0)

features_with_na=[features for features for dataframe.columns if dataframe[features].isnull().sum()>0]

对于 features_with_na 中的功能: 打印(特征,np.round(数据帧[特征].isnull()。mean(),4),'%缺失值') 打印(features_with_na)

它将为数据框中的每一列提供缺失值的百分比

答案 11 :(得分:-1)

df.isna()返回NaN的 True 值,其余返回 False 。因此,这样做:

df.isna().any()

对于任何具有NaN的列,将返回True,对于其余的列,则返回 False