【问题标题】:Remove columns that have 'N' number of NA values in it - python删除其中包含“N”个 NA 值的列 - python
【发布时间】:2016-07-10 02:08:51
【问题描述】:

假设我使用 df.isnull().sum() 并获得 df 数据帧所有列中所有“NA”值的计数。我想删除 NA 值高于“K”的列。

例如,

df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
                'B': [0, np.nan, np.nan, 0, 0, 0],
                'C': [0, 0, 0, 0, 0, 0.0],
                'D': [5, 5, np.nan, np.nan, 5.6, 6.8],
                'E': [0,np.nan,np.nan,np.nan,np.nan,np.nan],})
df.isnull().sum()

A    1
B    2
C    0
D    2
E    5
dtype: int64

假设我想删除具有 '2' 及以上数量 NA 值的列。将如何解决这个问题?我的输出应该是,

df.columns
A,C

谁能帮我做这件事?

谢谢

【问题讨论】:

  • 抱歉,您的意思是 NaN 还是字符串 'NA'?此外,您所需的输出与您的数据和对所需结果的解释不匹配
  • @EdChum 对此感到抱歉。我的错。我的意思是 NaN 值。我现在要换 DF。
  • @EdChum 再次为您的困惑感到抱歉。现在改了。

标签: python python-2.7 numpy pandas


【解决方案1】:

调用dropna 并传递axis=1 以逐列删除并传递thresh=len(df)-Kthresh 的作用是设置非NaN 值的最小数量,它等于行数减去K NaN价值观

In [22]:

df.dropna(axis=1, thresh=len(df)-1)
Out[22]:
     A  C
0  1.0  0
1  2.1  0
2  NaN  0
3  4.7  0
4  5.6  0
5  6.8  0

如果你只想要列:

In [23]:
df.dropna(axis=1, thresh=len(df)-1).columns

Out[23]:
Index(['A', 'C'], dtype='object')

或者简单地将计数输出与列屏蔽:

In [28]:
df.columns[df.isnull().sum() <2]

Out[28]:
Index(['A', 'C'], dtype='object')

【讨论】:

    【解决方案2】:

    可以这样做:

    df = df.reindex(columns=[x for x in df.columns.values if df[x].isnull().sum() < threshold])
    

    它只是构建一个符合您要求的列列表(少于阈值空值),然后使用该列表重新索引数据框。因此,如果您将阈值设置为 1:

    threshold = 1
    df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
                'B': [0, np.nan, np.nan, 0, 0, 0],
                'C': [0, 0, 0, 0, 0, 0.0],
                'D': [5, 5, np.nan, np.nan, 5.6, 6.8],
                'E': ['NA', 'NA', 'NA', 'NA', 'NA', 'NA'],})
    df = df.reindex(columns=[x for x in df.columns.values if df[x].isnull().sum() < threshold])
    df.count()
    

    将产生:

    C    6
    E    6
    dtype: int64
    

    【讨论】:

      【解决方案3】:

      dropna() 函数有一个 thresh 参数,允许您提供所需的非 NaN 值的数量,因此这将为您提供所需的输出:

      df.dropna(axis=1,thresh=5).count()
      
      A    5
      C    6
      E    6
      

      如果您只想要 C 和 E,在这种情况下,您必须将 thresh 更改为 6。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 2020-09-22
        • 2012-10-12
        • 2019-09-13
        • 2016-07-10
        • 2021-03-06
        • 1970-01-01
        相关资源
        最近更新 更多