如何对数据帧中的大量列应用条件

2024-04-25 00:40:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    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]

但这似乎效率低下。有没有更好的办法?你知道吗


Tags: columns数据indffor效率values办法
3条回答

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

假设范围是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)]

这是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

这样做的好处是,如果您愿意,它可以保留NaNs

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

只需对整个df执行此操作并调用^{}

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

{}当不满足条件cd3时,它产生值:

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

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

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

相关问题 更多 >