Python 如何将条件应用于数据帧中的大量列

Python 如何将条件应用于数据帧中的大量列,python,pandas,dataframe,Python,Pandas,Dataframe,我想消除具有大量列的数据帧中等于某个值(或在某个范围内)的所有行。例如,如果我有以下数据帧: a b 0 1 0 1 2 1 2 3 2 3 0 3 若要删除包含0的所有行,我可以使用: a_df[(a_df['a'] != 0) & (a_df['b'] !=0)] 但是,当您处理大量列时,这会成为一种痛苦。可以这样做: for i in a_df.columns.values: a_df = a_df[a_df[i] != 0] 但这似

我想消除具有大量列的数据帧中等于某个值(或在某个范围内)的所有行。例如,如果我有以下数据帧:

    a  b
 0  1  0
 1  2  1
 2  3  2
 3  0  3
若要删除包含0的所有行,我可以使用:

a_df[(a_df['a'] != 0) & (a_df['b'] !=0)]
但是,当您处理大量列时,这会成为一种痛苦。可以这样做:

for i in a_df.columns.values:
    a_df = a_df[a_df[i] != 0]

但这似乎效率低下。有更好的方法吗

只需对整个df执行此操作,然后调用:

条件
df!=0生成布尔掩码:

In [47]:    
df != 0

Out[47]:
       a      b
0   True  False
1   True   True
2   True   True
3  False   True
当这与df结合时,它会在不满足条件的情况下产生
NaN
值:

In [48]:
df[df != 0]

Out[48]:
    a   b
0   1 NaN
1   2   1
2   3   2
3 NaN   3

调用
dropna
会删除任何带有
NaN
值的行

这是EdChum方法的一种变体。你可以做
df!=0
然后使用
all
使您的选择器:

>>> (df != 0).all(axis=1)
0    False
1     True
2     True
3    False
dtype: bool
然后使用此选项选择:

>>> df.loc[(df != 0).all(axis=1)]
   a  b
1  2  1
2  3  2
这样做的好处是,如果您愿意,它可以保留NAN,例如

>>> df
   a   b
0  1   0
1  2 NaN
2  3   2
3  0   3
>>> df.loc[(df != 0).all(axis=1)]
   a   b
1  2 NaN
2  3   2
>>> df[(df != 0)].dropna()
   a  b
2  3  2

正如您在问题中所提到的,您可能需要删除具有某个范围内的值的行,您可以通过以下方法执行此操作

假设范围为
0,10,20

frame = DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
mask = frame.applymap(lambda x : False if x in [0 , 10 , 20] else True )
frame[mask.all(axis = 1)]

@DSM是的,只需重新阅读问题,只需致电
dropna
frame = DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
mask = frame.applymap(lambda x : False if x in [0 , 10 , 20] else True )
frame[mask.all(axis = 1)]