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

时间:2015-08-24 19:37:40

标签: 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]

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

2 个答案:

答案 0 :(得分:1)

只需为整个df执行此操作并致电dropna

In [45]:
df[df != 0].dropna()

Out[45]:
   a  b
1  2  1
2  3  2

条件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

的任何行

答案 1 :(得分:1)

这是EdChum方法的变体。您可以#printIcon{ background-image: url("../img/printingIcon.png"); background-size: 64px 70px; } 然后使用df != 0制作选择器:

all

然后使用它来选择:

>>> (df != 0).all(axis=1)
0    False
1     True
2     True
3    False
dtype: bool

这样做的好处是可以保留NaN,例如

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