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

den*_*var 110 python numpy nan dataframe pandas

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

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

谢谢

Max*_*axU 191

更新:使用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
Run Code Online (Sandbox Code Playgroud)

作为列的列表:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']
Run Code Online (Sandbox Code Playgroud)

选择那些列(包含至少一个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
Run Code Online (Sandbox Code Playgroud)

老答案:

尝试使用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
Run Code Online (Sandbox Code Playgroud)

或者@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']
Run Code Online (Sandbox Code Playgroud)

选择子集 - 包含至少一个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
Run Code Online (Sandbox Code Playgroud)

  • 没关系!只需将 .isnull() 替换为 .isin(['xxx']) 即可搜索值而不是空值:`df.columns[df.isin['xxx'].any()].tolist()` (2认同)

小智 21

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


小智 14

我有一个问题,我必须在屏幕上对许多列进行目视检查,因此筛选并返回违规列的候选列表是

nan_cols = [i for i in df.columns if df[i].isnull().any()]
Run Code Online (Sandbox Code Playgroud)

如果这对任何人有帮助

除此之外,如果您想过滤掉 nan 值超过阈值的列,比如 85% 然后使用

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


小智 9

df.columns[df.isnull().any()].tolist()
Run Code Online (Sandbox Code Playgroud)

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


bla*_*man 8

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

作为 1 行:

pd.isnull(df).sum()[pd.isnull(df).sum() > 0]
Run Code Online (Sandbox Code Playgroud)

描述

  1. 计算每列中的空值
null_count_ser = pd.isnull(df).sum()
Run Code Online (Sandbox Code Playgroud)
  1. True|False 系列描述该列是否有空值
is_null_ser = null_count_ser > 0
Run Code Online (Sandbox Code Playgroud)
  1. 使用T|F系列过滤掉那些没有的
null_count_ser[is_null_ser]
Run Code Online (Sandbox Code Playgroud)

示例输出

name          5
phone         187
age           644
Run Code Online (Sandbox Code Playgroud)


Uda*_*ran 6

这对我有用,

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

data.columns[data.isnull().any()]
Run Code Online (Sandbox Code Playgroud)

2. 用于获取带计数的列,至少有 1 个空值。

data[data.columns[data.isnull().any()]].isnull().sum()
Run Code Online (Sandbox Code Playgroud)

[可选] 3. 用于获取空计数的百分比。

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
Run Code Online (Sandbox Code Playgroud)


Pra*_*ngh 5

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

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))
Run Code Online (Sandbox Code Playgroud)

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

此外,您还可以根据哪些具有更多空值自动删除列和行
这是智能执行此操作的代码:

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

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