【问题标题】:Find empty or NaN entry in Pandas Dataframe在 Pandas Dataframe 中查找空或 NaN 条目
【发布时间】:2015-01-25 08:57:52
【问题描述】:

我正在尝试搜索 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 或空白条目的索引的列表?

【问题讨论】:

  • 空白条目是空字符串吗?还是它们是包含空格的字符串...?
  • 添加到原帖中。空白条目只是空字符串。

标签: list python-2.7 pandas indexing dataframe


【解决方案1】:

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?
  • 你可以用zip(np.where(df.applymap(lambda x: x == '')))列出“坐标”
  • 这个答案中的建议是我使用的:df = df.replace('', np.nan)replace the blank strings by NaN 然后df.loc[df.isna().any(axis=1)] 得到输出DataFrame。通过这样做,正如@unutbu 所建议的那样,不需要the slow .apply().applymap()
  • 为上述答案添加更多细节,您可以通过print(set((np.where(pd.isnull(train_df)))[1]))获取具有空值的列号,并使用df.columns[<column-number-with-null-value>]打印列名
【解决方案2】:

部分解决方案:对于单个字符串列 tmp = df['A1'].fillna(''); isEmpty = tmp=='' 在有空字符串或 NaN 值的情况下给出 True 的布尔系列。

【讨论】:

    【解决方案3】:

    试试这个:

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

    对于 NaN,您可以尝试:

    pd.isna(df['column_name'])
    

    【讨论】:

      【解决方案4】:

      我已经求助了

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

      最近。这样可以一次性获取 null 和空字符串单元格。

      【讨论】:

      • u 字符串前缀有什么作用?
      • 很久以前,在 python2.7 时代,默认情况下字符串不是 unicode,因此要创建 unicode 字符串文字,您必须在其前面加上 u
      【解决方案5】:

      获取特定列中包含空单元格的所有行。

      DF_new_row=DF_raw.loc[DF_raw['columnname']=='']
      

      这将给出满足检查条件的DF_raw的子集。

      【讨论】:

        【解决方案6】:

        使用.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
        

        【讨论】:

        • 这应该是一个新的公认答案,因为它提供了缺失值的最佳概述。
        【解决方案7】:

        另一个覆盖可能存在多个空格的情况的选项是使用isspace() python 函数。

        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'
        【解决方案8】:

        你也做了好事:

        text_empty = df['column name'].str.len() > -1

        df.loc[text_empty].index

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

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            【解决方案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
            

            【讨论】:

              猜你喜欢
              • 2017-04-30
              • 2017-08-08
              • 1970-01-01
              • 2018-04-24
              • 2019-10-20
              • 1970-01-01
              • 1970-01-01
              • 2021-12-13
              • 2017-12-31
              相关资源
              最近更新 更多