【问题标题】:Dropping columns with >N NaNs excluding specific columns删除具有 >N NaN 的列,不包括特定列
【发布时间】:2018-03-01 20:04:23
【问题描述】:

我想知道是否有一种简洁的方法可以排除具有超过 N 个 NaN 的所有列,从该子集中排除一列。

例如:

df = pd.DataFrame([[np.nan, 2, np.nan, 0], 
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5]],
                  columns=list('ABCD'))

结果:

    A   B   C   D
0   NaN 2.0 NaN 0
1   3.0 4.0 NaN 1
2   NaN NaN NaN 5

运行以下命令,我得到:

df.dropna(thresh=2, axis=1)

    B   D
0   2.0 0
1   4.0 1
2   NaN 5

我想保留“C”列。即,除了在“C”列之外执行此阈值。

这可能吗?

【问题讨论】:

    标签: python pandas filtering nan


    【解决方案1】:

    完成阈值处理后,您可以将列放回原处。如果您在一行中完成所有这些操作,您甚至不需要存储对列的引用。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                       [3, 4, np.nan, 1],
                       [np.nan, np.nan, np.nan, 5]],
                      columns=list('ABCD'))
    df.dropna(thresh=2, axis=1).assign(C=df['C'])
    

    你也可以这样做

    C = df['C']
    df.dropna(thresh=2, axis=1)
    df.assign(C=C)
    

    正如@Wen 所建议的,您还可以执行一个不会删除列 C 的索引操作。

    threshold = 2
    df = df.loc[:, (df.isnull().sum(0) < threshold) | (df.columns == 'C')]
    

    此处的列索引将选择值少于thresholdNaN 或名称为C 的列。如果您想在异常中包含不止一列,您可以使用“或”运算符| 链接更多条件。例如:

    df = df.loc[
        :,
        (df.isnull().sum(0) < threshold) |
        (df.columns == 'C') |
        (df.columns == 'D')]
    

    【讨论】:

      【解决方案2】:
      df.loc[:,(df.isnull().sum(0)<=1)|(df.isnull().sum(0)==len(df))]
      Out[415]: 
           B   C  D
      0  2.0 NaN  0
      1  4.0 NaN  1
      2  NaN NaN  5
      

      按照零的建议

      df.loc[:,(df.isnull().sum(0)<=1)|(df.isnull().all(0))]
      

      编辑:

      df.loc[:,(df.isnull().sum(0)<=1)|(df.columns=='C')]
      

      【讨论】:

      • df.isnull().all(0) 而不是 df.isnull().sum(0)==len(df)?
      • @Zero 已添加,:)
      • 这不太正确——它只适用于这个例子,因为 C 是唯一一个包含所有 NaN 的列。这将保留所有包含所有NaN 的列,而不一定是C 列(如果C 没有全部NaN)。
      【解决方案3】:

      另一个融合了其他答案的一些概念的观点。

      df.loc[:, df.isnull().assign(C=False).sum().lt(2)]
      
           B   C  D
      0  2.0 NaN  0
      1  4.0 NaN  1
      2  NaN NaN  5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 2011-11-04
        • 1970-01-01
        • 2023-01-16
        相关资源
        最近更新 更多