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