Python 级数的真值是模糊的。使用a.empty、a.bool()、a.item()、a.any()或a.all()
使用Python 级数的真值是模糊的。使用a.empty、a.bool()、a.item()、a.any()或a.all(),python,pandas,dataframe,boolean,filtering,Python,Pandas,Dataframe,Boolean,Filtering,使用或条件筛选我的结果数据帧时出现问题。我希望我的结果df提取所有大于0.25且小于-0.25的列var值 下面的逻辑为我提供了一个模糊的真值,但当我将此过滤拆分为两个单独的操作时,它仍然有效。这里发生了什么?不确定在何处使用建议的a.empty()、a.bool()、a.item()、a.any()或a.all() result=result[(result['var']>0.25)或(result['var']0.25).任何()或(df.C0.25).all()或(df.C>>df[[任何
或
条件筛选我的结果数据帧时出现问题。我希望我的结果df
提取所有大于0.25且小于-0.25的列var
值
下面的逻辑为我提供了一个模糊的真值,但当我将此过滤拆分为两个单独的操作时,它仍然有效。这里发生了什么?不确定在何处使用建议的a.empty()、a.bool()、a.item()、a.any()或a.all()
result=result[(result['var']>0.25)或(result['var']<-0.25)]
python语句中的或和和需要真值。对于熊猫
这些被认为是不明确的,因此您应该使用“按位”
(or)或&
(and)操作:
result = result[(result['var']>0.25) | (result['var']<-0.25)]
您遇到的是运算符隐式地将操作数转换为bool
(您使用了或,但对和,if
和while
也会发生这种情况):
除了这4条语句外,还有一些python函数隐藏了一些bool
调用(如any
,all
,filter
,…),这些函数通常不会对pandas.Series
产生问题,但为了完整性,我想提及这些函数
在您的案例中,异常并没有真正的帮助,因为它没有提到正确的替代方案。对于和
和或
,您可以使用(如果您希望进行元素比较):
- :
或者简单地使用
|
操作符:
>>> x | y
>>> x & y
- :
或者只需
和操作员:
>>> x | y
>>> x & y
如果您使用的是运算符,请确保正确设置括号,因为
有一些可以在熊猫系列
上使用
如果在执行if
或while
时遇到异常,则异常中提到的备选方案更适合。我将很快解释其中的每一个:
- 如果要检查序列是否为空
:
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
Python通常将容器的len
gth(如list
,tuple
,…)解释为真值,如果它没有显式的布尔解释。因此,如果需要类似python的检查,可以执行:if x.size
或if not x.empty
而不是if x
如果您的系列
包含一个且仅包含一个布尔值:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
如果要检查所有或任何项是否不为零、不为空或不为假:
>>> x = pd.Series([0, 1, 2])
>>> x.all() # because one element is zero
False
>>> x.any() # because one (or more) elements are non-zero
True
对于布尔逻辑,使用&
和
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
>>> df
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
2 0.950088 -0.151357 -0.103219
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
>>> df.loc[(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
当您有多个条件时,将返回多个列。这就是连接逻辑不明确的原因。使用和
或或
分别处理每个列,因此首先需要将该列减少为单个布尔值。例如,查看每列中的任何值或所有值是否为真
# 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.C>0.25).任何()或(df.C<-0.25).任何()
真的
#任一列中的所有值都为真?
(df.C>0.25).all()或(df.C<-0.25).all()
假的
实现相同功能的一种复杂方法是将所有这些列压缩在一起,并执行适当的逻辑
>>> 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
>>>df[[任何([a,b]),用于压缩中的a,b(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
有关更多详细信息,请参阅文档中的。或者,您也可以使用操作员模块。更详细的信息在这里
导入操作符
将numpy作为np导入
作为pd进口熊猫
np.random.seed(0)
df=pd.DataFrame(np.random.randn(5,3),columns=list('ABC'))
测向定位[操作员或(测向C>0.25,测向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.4438
很好地解释了正在发生的事情并提供了解决方案。我想添加另一种可能适用于类似情况的解决方案:使用以下方法:
result=result.query(((var>0.25)或(var<-0.25)”)
另见
(我目前正在使用的数据帧的一些测试表明,这种方法比在一系列布尔值上使用逐位运算符要慢一点:2毫秒比870µs)
一条警告:至少有一种情况是列名恰好是python表达式,这一点并不简单。我有一些列名为WT\u38hph\uip\u2
,WT\u38hph\uinput\u2
和log2(WT\u38hph\uip\u2/WT\u38hph\uinput\u2)
并希望执行以下查询:(log2(WT\u38hph\uip\u2/WT\u38hph\uinput\u2)>1)和(WT\u38hph\uip\u2>20)
我获得了以下异常级联:
keyrerror:'log2'
UndefinedVariableError:未定义名称“log2”
ValueError:“log2”不是受支持的函数
我猜这是因为查询解析器试图从前两列生成一些内容,而不是用第三列的名称标识表达式
提出了一种可能的解决方法。使用按位&
,每个条件都应包装在()
比如下面的作品
data_query = data[(data['year'] >= 2005) & (data['year'] <= 2010)]
data\u query=data[(data['year']>=2005)和(data['year']=2005&data['year']]我遇到了相同的错误,并在pyspark数据框中暂停了几天,由于我比较了两个字段的整数值,我能够通过用0填充na值成功地解决问题。您需要使用按位运算
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
>>> df
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
2 0.950088 -0.151357 -0.103219
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
>>> df.loc[(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
df.C > 0.25
0 True
1 False
2 False
3 True
4 True
Name: C, dtype: bool
# 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
import operator
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
df.loc[operator.or_(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.4438
result = result.query("(var > 0.25) or (var < -0.25)")
data_query = data[(data['year'] >= 2005) & (data['year'] <= 2010)]
data_query = data[(data['year'] >= 2005 & data['year'] <= 2010)]
mask = (df["col1"]>=df["col2"]) & (stock["col1"]<=df["col2"])
df_new = df[mask]
df[(some condition) conditional operator (some conditions)]
df[some condition conditional-operator some condition]
0.4808 x[(x > lb) * (x <= ub)]
0.4726 x[(x > lb) & (x <= ub)]
0.4904 x[np.logical_and(x > lb, x <= ub)]
0.4725 x[(x > lb) * (x <= ub)]
0.4806 x[(x > lb) & (x <= ub)]
0.5002 x[np.logical_and(x > lb, x <= ub)]
0.4781 x[(x > lb) * (x <= ub)]
0.4336 x[(x > lb) & (x <= ub)]
0.4974 x[np.logical_and(x > lb, x <= ub)]
import numpy as np
import random
lb, ub = np.sort([random.random() * 100, random.random() * 100]).tolist()
lb, ub
x = pd.DataFrame(np.linspace(0,100))
def asterik(x):
x = x.to_numpy()
return x[(x > lb) * (x <= ub)]
def and_symbol(x):
x = x.to_numpy()
return x[(x > lb) & (x <= ub)]
def numpy_logical(x):
x = x.to_numpy()
return x[np.logical_and(x > lb, x <= ub)]
for i in range(3):
%timeit asterik(x)
%timeit and_symbol(x)
%timeit numpy_logical(x)
print('\n')
23 µs ± 3.62 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
35.6 µs ± 9.53 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
31.3 µs ± 8.9 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
21.4 µs ± 3.35 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
21.9 µs ± 1.02 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
21.7 µs ± 500 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
25.1 µs ± 3.71 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
36.8 µs ± 18.3 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
28.2 µs ± 5.97 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)