使用 or 条件我想要我的结果 df 提取所有列 var 高于0.25且低于-0.25的值。 下面的逻辑为我提供了一个模糊的真值,但当我将此过滤拆分为两个单独的操作时,它仍然有效。这里发生了什么?不确定在哪里使用建议的 a.empty(), a.bool(), a.item(),a.any() or a.all() .
result = result[(result['var'] > 0.25) or (result['var'] < -0.25)]
这个 or 及 and python语句需要 truth -价值观。对于 pandas 这些被认为是不明确的,所以您应该使用“按位” | (或)或 & (和)业务:
result = result[(result['var']>0.25) | (result['var']<-0.25)]
对于这些类型的数据结构,它们被重载以生成元素级的数据 or (或 and ). 只是想对这句话再做一些解释: 当您想要获取 bool 属于 pandas.Series :
>>> import pandas as pd
>>> x = pd.Series([1])
>>> bool(x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
您找到的是运算符将操作数隐式转换为 bool (你曾经 or 但这种情况也发生在 and , if 及 while ):
>>> x or x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> x and x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> if x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> while x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
除了这4条语句之外,还有几个python函数隐藏了一些 bool 电话(如 any , all , filter ,…)这些通常不存在问题 pandas.Series 但为了完整性,我想提到这些。 在您的案例中,异常并没有真正的帮助,因为它没有提到正确的替代方案。对于 and 及 or 您可以使用(如果希望进行元素级比较): numpy.logical_or :
当您有多个条件时,将返回多个列。这就是连接逻辑不明确的原因。使用 and 或 or 分别处理每个列,因此首先需要将该列减少为单个布尔值。例如,查看每列中的任何值或所有值是否为真。
# Any value in either column is True?
(df.C > 0.25).any() or (df.C < -0.25).any()
True
# All values in either column is True?
(df.C > 0.25).all() or (df.C < -0.25).all()
False
实现相同功能的一种复杂方法是将所有这些列压缩在一起,并执行适当的逻辑。
>>> df[[any([a, b]) for a, b in zip(df.C > 0.25, df.C < -0.25)]]
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
result = result.query("(var > 0.25) or (var < -0.25)")
另见http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-询问。 (我目前正在使用的 Dataframe 的一些测试表明,这种方法比在一系列布尔值上使用逐位运算符要慢一点:2毫秒比870µs) 一条警告:至少有一种情况是,列名恰好是python表达式,这种情况并不简单。我有一些列被命名为 WT_38hph_IP_2 , WT_38hph_input_2 及 log2(WT_38hph_IP_2/WT_38hph_input_2) 并希望执行以下查询: "(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)" 我获得了以下异常级联: KeyError: 'log2' UndefinedVariableError: name 'log2' is not defined ValueError: "log2" is not a supported function 我猜这是因为查询解析器试图从前两列生成一些内容,而不是用第三列的名称标识表达式。 这里提出了一种可能的解决方法。
10条答案
按热度按时间bnlyeluc1#
这个
or
及and
python语句需要truth
-价值观。对于pandas
这些被认为是不明确的,所以您应该使用“按位”|
(或)或&
(和)业务:对于这些类型的数据结构,它们被重载以生成元素级的数据
or
(或and
).只是想对这句话再做一些解释:
当您想要获取
bool
属于pandas.Series
:您找到的是运算符将操作数隐式转换为
bool
(你曾经or
但这种情况也发生在and
,if
及while
):除了这4条语句之外,还有几个python函数隐藏了一些
bool
电话(如any
,all
,filter
,…)这些通常不存在问题pandas.Series
但为了完整性,我想提到这些。在您的案例中,异常并没有真正的帮助,因为它没有提到正确的替代方案。对于
and
及or
您可以使用(如果希望进行元素级比较):numpy.logical_or
:或者仅仅是
|
接线员:ryoqjall2#
对于布尔逻辑,使用
&
及|
.要查看发生了什么,您可以为每个比较获取一列布尔值,例如。
当您有多个条件时,将返回多个列。这就是连接逻辑不明确的原因。使用
and
或or
分别处理每个列,因此首先需要将该列减少为单个布尔值。例如,查看每列中的任何值或所有值是否为真。实现相同功能的一种复杂方法是将所有这些列压缩在一起,并执行适当的逻辑。
有关更多详细信息,请参阅文档中的布尔索引。
xuo3flqw3#
Pandas是按位使用的
&
|
每个条件都应该用一个()
比如下面的作品但没有适当括号的同一个查询不适用
eit6fx6z4#
或者,您也可以使用操作员模块。更详细的信息在这里
2hh7jdfx5#
这个极好的答案很好地解释了正在发生的事情,并提供了一个解决方案。我想添加另一个可能适用于类似情况的解决方案:使用
query
方法:另见http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-询问。
(我目前正在使用的 Dataframe 的一些测试表明,这种方法比在一系列布尔值上使用逐位运算符要慢一点:2毫秒比870µs)
一条警告:至少有一种情况是,列名恰好是python表达式,这种情况并不简单。我有一些列被命名为
WT_38hph_IP_2
,WT_38hph_input_2
及log2(WT_38hph_IP_2/WT_38hph_input_2)
并希望执行以下查询:"(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)"
我获得了以下异常级联:KeyError: 'log2'
UndefinedVariableError: name 'log2' is not definedValueError: "log2" is not a supported function
我猜这是因为查询解析器试图从前两列生成一些内容,而不是用第三列的名称标识表达式。这里提出了一种可能的解决方法。
lmyy7pcs6#
我遇到了相同的错误,并被pyspark Dataframe 暂停了几天,我能够通过使用0填充na值成功地解决它,因为我比较了两个字段中的整数值。
e5nszbig7#
您需要使用位运算符
|
而不是or
及&
而不是and
在pandas中,不能简单地使用python中的bool语句。对于更复杂的过滤,请创建一个
mask
并在 Dataframe 上应用掩码。将所有查询放入掩码并应用它。
假设,
14ifxucb8#
我将尝试给出三种最常见的方法的基准(如上所述):
结果:
但是
*
panda系列中不支持,并且numpy阵列比pandas Dataframe 快(大约慢1000倍,请参见编号):结果:
注意:添加一行代码
x = x.to_numpy()
将需要大约20µs。对于那些喜欢
%timeit
:结果:
stszievb9#
一件小事,浪费了我的时间。
输入条件(如果使用“=”、“!=”)进行比较)在括号中,不这样做也会引发此异常。这会奏效的
这不会
8zzbczxx10#
此命令中出现错误:
如果df!='':通过
但当我把它改成这样时,它起了作用:
如果df不是“”:通过