【问题标题】:Drop Rows by Multiple Column Criteria in DataFrame在 DataFrame 中按多列条件删除行
【发布时间】:2015-05-29 11:18:33
【问题描述】:

我有一个 pandas 数据框,我试图根据选择列的条件删除行。如果这些选择列中的值为零,则应删除行。这是一个例子。

import pandas as pd
t = pd.DataFrame({'a':[1,0,0,2],'b':[1,2,0,0],'c':[1,2,3,4]})

  a b c
0 1 1 1 
1 0 2 2 
2 0 0 3 
3 2 0 4

我想尝试以下方法:

cols_of_interest = ['a','b'] #Drop rows if zero in all these columns
t = t[t[cols_of_interest]!=0]

这不会删除行,所以我尝试了:

t = t.drop(t[t[cols_of_interest]==0].index)

所有行都被删除。

我想结束的是:

  a b c
0 1 1 1 
1 0 2 2 
3 2 0 4

第 3 行(索引 2)被删除的地方,因为它在感兴趣的两列中都取值为 0,而不仅仅是一列。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您的问题是您首先分配了布尔条件的结果:t = t[t[cols_of_interest]!=0],它会覆盖您的原始 df 并设置不满足条件的位置 NaN 值。

    您要做的是生成布尔掩码,然后删除NaN 行并传递thresh=1,以便该行中必须至少有一个非NaN 值,然后我们可以使用@ 987654327@ 并使用它的索引来获得所需的df:

    In [124]:
    
    cols_of_interest = ['a','b']
    t.loc[t[t[cols_of_interest]!=0].dropna(thresh=1).index]
    Out[124]:
       a  b  c
    0  1  1  1
    1  0  2  2
    3  2  0  4
    

    编辑

    正如@DSM 所指出的,您可以通过使用any 并传递axis=1 来测试条件并使用它来索引您的df:

    In [125]:
    
    t[(t[cols_of_interest] != 0).any(axis=1)]
    Out[125]:
       a  b  c
    0  1  1  1
    1  0  2  2
    3  2  0  4
    

    【讨论】:

    • 你为什么不简单地使用t[(t[cols_of_interest] != 0).any(axis=1)]或其他什么?
    • @DSM 好点,我实际上是在修复 OP 的尝试,会更新
    • 谢谢!我不知道布尔掩码的事情 - 我将不得不进一步阅读。第二个编辑/答案也很有意义。
    猜你喜欢
    • 2016-10-25
    • 2023-02-14
    • 2022-06-21
    • 2020-12-22
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多