我想在满足以下几个条件时删除行:
示例 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()
有人可以帮助我如何删除基于多个条件?
2条答案
按热度按时间qni6mghb1#
由于我不是100%清楚的原因,
pandas
可以很好地处理位逻辑运算符|
和&
,但不能处理布尔运算符or
和and
。试试这个:
niknxzdl2#
drop
可用于删除行最明显的方法是在给定条件的情况下构造一个布尔掩码,通过它过滤索引以获得一个索引数组,并使用
drop()
删除这些索引。如果条件是:col 'one'、'two'、或'three'的值大于0的行;col 'four'的和值小于0应被删除。
则以下工作。
条件的第一部分,即
col 'one', 'two', or 'three' greater than 0
,可以用.any(axis=1)
简洁地写出来:保留要删除的行的补码
删除/移除/丢弃行是保留行的逆操作。因此,执行此任务的另一种方法是对用于删除行的布尔掩码取反(
~
),并通过它过滤 Dataframe 。query()
要保留的行pd.DataFrame.query()
是一个非常可读的API,用于过滤要保留的行。它还“理解”and
/or
等。以上所有操作执行以下转换: