在Pandas Dataframe中查找空或NaN条目

ede*_*esz 28 indexing list dataframe python-2.7 pandas

我正在尝试搜索Pandas Dataframe以查找缺少条目或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
Run Code Online (Sandbox Code Playgroud)

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

如果我有这个数据帧,我怎样才能找到包含NaN或空白条目的索引的列表?

unu*_*tbu 29

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

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

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

请注意,使用applymap需要为DataFrame的每个单元调用一次Python函数.对于大型DataFrame而言,这可能会很慢,因此如果您可以安排所有空白单元格包含NaN,那么您可以使用它pd.isnull.

  • 这个答案中的建议是我使用的:`df = df.replace('', np.nan)` 来[用`NaN`替换空白字符串](https://www.quora.com/How- do-I-replace-all-blank-empty-cells-in-a-pandas-dataframe-with-NaNs) 然后`df.loc[df.isna().any(axis=1)]` 得到输出`DataFrame`。通过这样做,正如@unutbu 所建议的,不需要 [缓慢的`.apply()`](/sf/ask/3810280841/使用-pandas-apply-in-my-code/54432584#54432584) 或`.applymap()`。 (3认同)
  • 你可以用`zip(np.where(df.applymap(lambda x:x ==''))来制作一个"坐标"列表. (2认同)

jer*_*man 12

我采取了

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

最近。一次性获得空和空字符串单元格。

  • 许多年前,在 python2.7 时代,默认情况下字符串不是 unicode,因此要创建 unicode 字符串文字,您必须在其前面加上“u”前缀 (5认同)

Ale*_*der 12

检查列是否包含Nanusing.isnull()并检查空字符串 using .eq(''),然后使用按位 OR 运算符将两者连接在一起|

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

  • 这应该是一个新的公认答案,因为它给出了缺失值的最佳概述。 (3认同)

Vya*_*hez 11

尝试这个:

df[df['column_name'] == ''].index
Run Code Online (Sandbox Code Playgroud)

对于NaN,您可以尝试:

pd.isna(df['column_name'])
Run Code Online (Sandbox Code Playgroud)


小智 11

在我看来,不要浪费时间,直接用 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
Run Code Online (Sandbox Code Playgroud)

  • 建议,应该是 `df.replace('', np.nan)` - 检查空时没有空格 (5认同)