【问题标题】:How to find which columns contain any NaN value in Pandas dataframe如何在 Pandas 数据框中查找哪些列包含任何 NaN 值
【发布时间】:2016-07-13 13:43:51
【问题描述】:

给定一个 pandas 数据框,其中包含分散在各处的可能 NaN 值:

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

【问题讨论】:

  • df.isna().any()[lambda x: x] 为我工作

标签: python pandas dataframe nan


【解决方案1】:

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

旧答案:

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

【讨论】:

  • 感谢您的回复!我正在寻找列名列表(我相应地更新了我的问题),你知道怎么做吗?
  • 您知道一种选择具有特定值而不是空值的所有列的好方法吗?
  • 没关系!只需将 .isnull() 替换为 .isin(['xxx']) 即可搜索值而不是空值:df.columns[df.isin['xxx'].any()].tolist()
  • @gregorio099,我会这样做:df.columns[df.eq(search_for_value).any()].tolist()
  • 不错的答案,已经投票了。想法 - 可以添加新功能isna, notna 吗?
【解决方案2】:

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

【讨论】:

  • 您有没有基于此方法的快速使用和设置条件的方法。例如,如果 col4 和 col5 和 col6 为空:df=df[["col1","col2","col3"]]
【解决方案3】:

我遇到了一个问题,我必须在屏幕上对许多列进行目视检查,因此筛选并返回有问题的列的候选名单组合是

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

如果这对任何人都有帮助

如果您想过滤掉具有比阈值更多的 nan 值的列,例如 85% 然后使用

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

【讨论】:

    【解决方案4】:

    这对我有用,

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

    data.columns[data.isnull().any()]
    

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

    data[data.columns[data.isnull().any()]].isnull().sum()
    

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

    data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
    

    【讨论】:

    • 感谢您的多种方法!
    【解决方案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))
    

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

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

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

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

    【讨论】:

      【解决方案6】:
      df.columns[df.isnull().any()].tolist()
      

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          这是其中一种方法..

          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

          【讨论】:

            【解决方案9】:

            这两个都应该工作:

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

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

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

            【讨论】:

              【解决方案10】:

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

              作为 1-liner:

              pd.isnull(df).sum()[pd.isnull(df).sum() > 0]
              

              说明

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

              示例输出

              name          5
              phone         187
              age           644
              

              【讨论】:

              • 效果很好,谢谢!
              【解决方案11】:

              df.isna() 为 NaN 返回 True 值,其余为 False。所以,做:

              df.isna().any()

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

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                  【解决方案13】:

                  features_with_na=[如果 dataframe[features].isnull().sum()>0 的情况下,dataframe.columns 中的特征的特征]

                  对于 features_with_na 中的功能: print(feature, np.round(dataframe[feature].isnull().mean(), 4), '% 缺失值') 打印(features_with_na)

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

                  【讨论】:

                    【解决方案14】:

                    如果您想查找包含 NaN 值的列并获取列名列表,则该代码有效。

                    na_names = df.isnull().any()
                    list(na_names.where(na_names == True).dropna().index)
                    

                    如果要查找值为 all NaN 的列,可以将 any 替换为 all

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2018-11-02
                      • 2019-04-27
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-11-16
                      • 2016-10-19
                      • 2011-08-18
                      相关资源
                      最近更新 更多