【问题标题】:Python Drop all instances of Feature from DF if NaN thresh is met如果满足 NaN 阈值,Python 从 DF 中删除所有特征实例
【发布时间】:2020-01-05 04:16:16
【问题描述】:

使用df.dropna(thresh = x, inplace=True),我可以成功删除至少缺少x 非nan 值的行。

但是因为我的 df 看起来像:

          2001     2002     2003    2004

bob   A   123      31       4        12
bob   B   41        1       56       13
bob   C   nan      nan      4        nan

bill  A   451      8        nan      24
bill  B   32       5        52        6
bill  C   623      12       41       14

#Repeating features (A,B,C) for each index/name

这会删除满足thresh= 条件的一行/实例,但保留该功能的其他实例。

如果任何一行都满足thresh,我想要的是放弃整个功能的东西,例如:

df.dropna(thresh = 2, inplace=True):

           2001     2002     2003    2004

bob    A    123      31       4        12
bob    B    41        1       56       13

bill   A    451      8        nan      24
bill   B    32       5        52        6

#Drops C from the whole df

其中C被从整个df中删除,而不仅仅是一次满足bob下的条件

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    您的示例看起来像一个多索引索引数据框,其中索引级别 1 是特征 A, B, C,索引级别 0 是名称。您可以使用notnasum 创建掩码来识别非nan 值的数量小于2 的行并获取它们的索引级别1 值。最后,使用df.query 对行进行切片

    a = df.notna().sum(1).lt(2).loc[lambda x: x].index.get_level_values(1)
    df_final = df.query('ilevel_1 not in @a')
    
    Out[275]:
             2001  2002  2003  2004
    bob  A  123.0  31.0   4.0  12.0
         B   41.0   1.0  56.0  13.0
    bill A  451.0   8.0   NaN  24.0
         B   32.0   5.0  52.0   6.0
    

    方法二
    使用 notnasumgroupbytransform 在非 nan 值大于或等于 2 的组上创建掩码 True。最后,使用此掩码对行进行切片

    m = df.notna().sum(1).groupby(level=1).transform(lambda x: x.ge(2).all())
    df_final = df[m]
    
    Out[296]:
             2001  2002  2003  2004
    bob  A  123.0  31.0   4.0  12.0
         B   41.0   1.0  56.0  13.0
    bill A  451.0   8.0   NaN  24.0
         B   32.0   5.0  52.0   6.0
    

    【讨论】:

    • 它是多索引的,你是对的。你的方法看起来行得通,现在试试……谢谢!!
    • 在应用到我的实际 df 时,我遇到的成功较少......我没有正确应用它吗?此外,我是否需要将这些放在一个循环中?我仍然相信您的答案是正确的,但我认为我的应用并不正确。我的实际 df 的结构和这个是相同的,除了有多个系列 ('C') 具有所有 NaN 值。
    • @Alex: thresh 中的dropna 选项是non-NaN 的数量。那么,您想根据non-NaN 的数量或NaN 的数量删除行吗?
    • 请见谅。我相信您的答案是正确的方法,但是当我运行 df.reset_index() pd.DataFrame(Counter(df.series).keys(), Counter(df.series).values()) 时,我发现每个系列的系列计数不同,而我希望它们都相同。
    • 我将链接到转发的问题:stackoverflow.com/questions/59621000/…
    【解决方案2】:

    只保留至少有 5 个非 NA 值的行。

    df.dropna(thresh=5)

    thresh 用于包含最少非 NaN 数的行

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      相关资源
      最近更新 更多