在Pandas数据框中查找空值或NaN条目

96

我正在尝试搜索Pandas数据框以查找其中是否有缺失条目或NaN条目。

这是我正在使用的数据框:

cl_id       a           c         d         e        A1              A2             A3
    0       1   -0.419279  0.843832 -0.530827    text76        1.537177      -0.271042
    1       2    0.581566  2.257544  0.440485    dafN_6        0.144228       2.362259
    2       3   -1.259333  1.074986  1.834653    system                       1.100353
    3       4   -1.279785  0.272977  0.197011     Fifty       -0.031721       1.434273
    4       5    0.578348  0.595515  0.553483   channel        0.640708       0.649132
    5       6   -1.549588 -0.198588  0.373476     audio       -0.508501               
    6       7    0.172863  1.874987  1.405923    Twenty             NaN            NaN
    7       8   -0.149630 -0.502117  0.315323  file_max             NaN            NaN

注意:空白条目是空字符串-这是因为数据框来源文件中没有字母数字内容。

如果我有这个数据框,如何找到包含NaN或空白条目的索引列表?


3
这些空白条目是空字符串吗?还是包含空格的字符串...? - unutbu
2
添加到原帖。空白条目只是空字符串。 - edesz
10个回答

84

np.where(pd.isnull(df)) 返回值为 NaN 的行和列的索引:

In [152]: import numpy as np
In [153]: import pandas as pd
In [154]: np.where(pd.isnull(df))
Out[154]: (array([2, 5, 6, 6, 7, 7]), array([7, 7, 6, 7, 6, 7]))

In [155]: df.iloc[2,7]
Out[155]: nan

In [160]: [df.iloc[i,j] for i,j in zip(*np.where(pd.isnull(df)))]
Out[160]: [nan, nan, nan, nan, nan, nan]

使用applymap可以找到空字符串的值:

In [182]: np.where(df.applymap(lambda x: x == ''))
Out[182]: (array([5]), array([7]))

请注意,使用 applymap 需要为 DataFrame 的每个单元格调用一次 Python 函数。对于大型 DataFrame,这可能会很慢,因此最好安排所有空单元格包含 NaN,这样您就可以使用 pd.isnull


对于空白/缺失的条目(applymap),是否有一种方法将其放入列表中?例如:是否有一种提取列表的方法,如[2,5],对应于索引2和索引5? - edesz
2
你可以使用zip(np.where(df.applymap(lambda x: x == '')))来创建一个“坐标”列表。 - unutbu
3
这个回答中的建议是我所用的:df = df.replace('', np.nan)将空字符串替换为NaN,然后使用 df.loc[df.isna().any(axis=1)] 来获取输出数据框。根据 @unutbu 的建议,这样做就不需要使用较慢的.apply()方法.applymap()方法。 - edesz
在上面的答案中添加更多细节,您可以通过 print(set((np.where(pd.isnull(train_df)))[1])) 获取具有空值的列号,并使用 df.columns[<column-number-with-null-value>] 打印列名。 - Rushikesh Gaidhani

60

试试这个:

df[df['column_name'] == ''].index

对于NaN,你可以尝试:

pd.isna(df['column_name'])

25

使用.isnull()检查列是否包含Nan,使用.eq('')检查空字符串,然后使用按位或运算符|将两者组合起来。

沿着axis 0求和以查找存在缺失数据的列,然后沿着axis 1求和以获取存在缺失数据行的索引位置。

missing_cols, missing_rows = (
    (df2.isnull().sum(x) | df2.eq('').sum(x))
    .loc[lambda x: x.gt(0)].index
    for x in (0, 1)
)

>>> df2.loc[missing_rows, missing_cols]
         A2       A3
2            1.10035
5 -0.508501         
6       NaN      NaN
7       NaN      NaN

3
这应该是一个新的被接受的答案,因为它提供了缺失值的最佳概述。 - Kokokoko
.eq('') also works inside .query(). So you can find them by df.query('column_name.eq("")', engine='python') - mrdaliri

13

最近我使用了以下方法:

df[ (df[column_name].notnull()) & (df[column_name]!=u'') ].index

这个方法可以同时获取空值和空字符串的单元格。


u 字符串前缀有什么作用? - dumbledad
6
很久以前,在Python2.7时代,默认情况下字符串不是Unicode编码的,所以要创建一个Unicode字符串字面量,你需要在它前面加上 u 前缀。 - jeremy_rutman

10

我认为,不要浪费时间,直接使用 NaN 进行替换!然后,搜索所有带有 Na 的条目。(这是正确的,因为空值无论如何都是缺失值。)

import numpy as np                             # to use np.nan 
import pandas as pd                            # to use replace
    
df = df.replace(' ', np.nan)                   # to get rid of empty values
nan_values = df[df.isna().any(axis=1)]         # to get all rows with Na

nan_values                                     # view df with NaN rows only

5
建议使用df.replace('', np.nan),在检查空值时不要加空格。 - FullMetalScientist

4

部分解决方案:针对单个字符串列 tmp = df['A1'].fillna(''); isEmpty = tmp=='' 返回一个布尔值序列,其中包含空字符串或NaN值的True。


3

你还可以做一些好事:

text_empty = df['列名'].str.len() > -1

df.loc[text_empty].index

结果将会是空行及其索引号。


3
另一种处理可能存在多个空格的情况的方法是使用Python函数isspace()
df[df.col_name.apply(lambda x:x.isspace() == False)] # will only return cases without empty spaces

添加NaN值:

df[(df.col_name.apply(lambda x:x.isspace() == False) & (~df.col_name.isna())] 

哎呀...AttributeError: 'NoneType' object has no attribute 'isspace' - Monica Heddneck

1
您可以使用字符串方法和正则表达式来查找空字符串的单元格:

df[~df.column_name.str.contains('\w')].column_name.count()


1
获取包含特定列中空单元格的所有行。
DF_new_row=DF_raw.loc[DF_raw['columnname']=='']

这将给出符合检查条件的DF_raw子集。

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