按DataFrame中的多列标准删除行

时间:2015-03-25 16:44:04

标签: python pandas dataframe

我有一个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,而不只是一个。

1 个答案:

答案 0 :(得分:2)

这里的问题是你首先分配了布尔条件的结果:t = t[t[cols_of_interest]!=0]覆盖原始df并设置NaN值不符合条件的地方。

您要做的是生成布尔掩码,然后删除NaN行并传递thresh=1,以便该行中必须至少有一个非NaN值然后,我们可以使用loc并使用此索引获得所需的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