pandas 根据panda Dataframe 中的多个条件删除行

aamkag61  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(220)

我想在满足以下几个条件时删除行:
示例 Dataframe 如下所示:

one       two     three      four
0 -0.225730 -1.376075  0.187749  0.763307
1  0.031392  0.752496 -1.504769 -1.247581
2 -0.442992 -0.323782 -0.710859 -0.502574
3 -0.948055 -0.224910 -1.337001  3.328741
4  1.879985 -0.968238  1.229118 -1.044477
5  0.440025 -0.809856 -0.336522  0.787792
6  1.499040  0.195022  0.387194  0.952725
7 -0.923592 -1.394025 -0.623201 -0.738013
8 -1.775043 -1.279997  0.194206 -1.176260
9 -0.602815  1.183396 -2.712422 -0.377118

我想根据以下条件删除行:

  • col 'one'、'two'、'three'的值大于0的行;小于0的col 'four'值应被删除。*

然后我尝试实现如下:

df = df[df.one > 0 or df.two > 0 or df.three > 0 and df.four < 1]

但是,它会导致如下错误消息:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有人可以帮助我如何删除基于多个条件?

qni6mghb

qni6mghb1#

由于我不是100%清楚的原因,pandas可以很好地处理位逻辑运算符|&,但不能处理布尔运算符orand
试试这个:

df = df[(df.one > 0) | (df.two > 0) | (df.three > 0) & (df.four < 1)]
niknxzdl

niknxzdl2#

drop可用于删除行

最明显的方法是在给定条件的情况下构造一个布尔掩码,通过它过滤索引以获得一个索引数组,并使用drop()删除这些索引。如果条件是:
col 'one'、'two'、'three'的值大于0的行;col 'four'的值小于0应被删除。
则以下工作。

msk = (df['one'].gt(0) | df['two'].gt(0) | df['three'].gt(0)) & df['four'].lt(0)
idx_to_drop = df.index[msk]
df1 = df.drop(idx_to_drop)

条件的第一部分,即col 'one', 'two', or 'three' greater than 0,可以用.any(axis=1)简洁地写出来:

msk = df[['one', 'two', 'three']].gt(0).any(axis=1) & df['four'].lt(0)
保留要删除的行的补码

删除/移除/丢弃行是保留行的逆操作。因此,执行此任务的另一种方法是对用于删除行的布尔掩码取反(~),并通过它过滤 Dataframe 。

msk = df[['one', 'two', 'three']].gt(0).any(axis=1) & df['four'].lt(0)
df1 = df[~msk]
query()要保留的行

pd.DataFrame.query()是一个非常可读的API,用于过滤要保留的行。它还“理解”and/or等。

# negate the condition to drop
df1 = df.query("not ((one > 0 or two > 0 or three > 0) and four < 0)")

# the same condition transformed using de Morgan's laws
df1 = df.query("one <= 0 and two <= 0 and three <= 0 or four >= 0")

以上所有操作执行以下转换:

相关问题