【问题标题】:Filter out rows with more than certain number of NaN过滤掉超过一定数量的 NaN 的行
【发布时间】:2014-06-05 21:16:02
【问题描述】:

在 Pandas 数据框中,我想过滤掉所有超过 2 个NaNs 的行。

基本上,我有 4 列,我想只保留至少 2 列具有有限值的那些行。

有人可以建议如何实现这一目标吗?

【问题讨论】:

    标签: python pandas dataframe filter


    【解决方案1】:

    我有一个稍微不同的问题,即过滤掉具有超过一定数量 NaN 的

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'a':[1,2,np.nan,4,5], 'b':[np.nan,2,np.nan,4,5], 'c':[1,2,np.nan,np.nan,np.nan], 'd':[1,2,3,np.nan,5]})
    df
    
        a   b   c   d
    0   1.0 NaN 1.0 1.0
    1   2.0 2.0 2.0 2.0
    2   NaN NaN NaN 3.0
    3   4.0 4.0 NaN NaN
    4   5.0 5.0 NaN 5.0
    

    假设您要过滤掉具有 3 个或更多 Nan 的列:

    num_rows = df.shape[0]
    drop_cols_with_this_amount_of_nans_or_more = 3
    keep_cols_with_at_least_this_number_of_non_nans = num_rows - drop_cols_with_this_amount_of_nans_or_more + 1
    
    df.dropna(axis=1,thresh=keep_cols_with_at_least_this_number_of_non_nans)
    

    输出:(列 c 已按预期删除):

        a   b   d
    0   1.0 NaN 1.0
    1   2.0 2.0 2.0
    2   NaN NaN 3.0
    3   4.0 4.0 NaN
    4   5.0 5.0 5.0
    

    【讨论】:

      【解决方案2】:

      您在这里提出了 2 个略有不同的问题。在一般的情况下,他们有不同的答案。

      我只想保留至少有 2 列的行 有限值。

      df = df.dropna(thresh=2)
      

      保留行具有 2 个或更多非空值


      我想过滤掉所有超过 2 个NaNs 的行

      df = df.dropna(thresh=df.shape[1]-2)
      

      过滤掉具有 2 个或更多 null 值的行。

      在您的 4 列示例数据框中,这些操作是等效的,因为 df.shape[1] - 2 == 2。但是,您会注意到与不完全包含 4 列的数据帧存在差异。


      注意dropna 也有一个subset 参数,如果您希望在应用阈值时仅包含指定的列。例如:

      df = df.dropna(subset=['col1', 'col2', 'col3'], thresh=2)
      

      【讨论】:

        【解决方案3】:

        以下应该可以工作

        df.dropna(thresh=2)
        

        online docs

        我们在这里所做的是删除任何 NaN 行,其中连续有 2 个或多个非 NaN 值。

        例子:

        In [25]:
        
        import pandas as pd
        
        df = pd.DataFrame({'a':[1,2,NaN,4,5], 'b':[NaN,2,NaN,4,5], 'c':[1,2,NaN,NaN,NaN], 'd':[1,2,3,NaN,5]})
        
        df
        
        Out[25]:
        
            a   b   c   d
        0   1 NaN   1   1
        1   2   2   2   2
        2 NaN NaN NaN   3
        3   4   4 NaN NaN
        4   5   5 NaN   5
        
        [5 rows x 4 columns]
        
        In [26]:
        
        df.dropna(thresh=2)
        
        Out[26]:
        
           a   b   c   d
        0  1 NaN   1   1
        1  2   2   2   2
        3  4   4 NaN NaN
        4  5   5 NaN   5
        
        [4 rows x 4 columns]
        

        编辑

        对于上面的示例,它可以工作,但您应该注意,您必须知道列数并适当地设置 thresh 值,我最初以为它是指 NaN 值的数量,但它实际上意味着 NaN 值。

        【讨论】:

        • 如果我想创建一个包含 2 个或更多空值的行的数据框,而不是删除它们。我该怎么做?
        • 使用:df = df[df.isnull().sum(axis=1) >= 2]
        猜你喜欢
        • 2017-10-04
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2021-02-12
        • 2021-10-21
        • 2013-12-16
        • 2017-09-17
        • 1970-01-01
        相关资源
        最近更新 更多