pandas42 eval-字符串表达式查询:大数据( tcy)

pandas41 query-字符串表达式查询:大数据函数( tcy)https://mp.csdn.net/postedit/85887334

pandas42 eval-字符串表达式查询:大数据( tcy)https://mp.csdn.net/postedit/85918442

表达式评估eval() 2019/1/6

1.1.函数:

pd.eval(expr, parser='pandas', engine=None, truediv=True, local_dict=None,
global_dict=None, resolvers=(), level=0, target=None, inplace=False)
df.eval(expr, inplace=False, **kwargs)

用途:
   # 使用各种后端将Python表达式评估为字符串。
   # 顶级函数pandas.eval()实现Series和DataFrame对象的表达式评估

参数:
expr:str或unicode要评估的仅仅是Python 表达式(支持除移位的运算符)
parser:字符串,默认'pandas'解析器,{'pandas','python'}
engine:string或None,默认'numexpr',{'python','numexpr'}评估表达式的引擎
truediv:bool,可选是否使用真正的除法,如Python> = 3
local_dict:dict或None,可选局部变量字典,默认情况下取自locals()
global_dict:dict或None,可选全局变量字典,默认情况下取自globals()

resolvers:dict-like或None列表,可选
   # 实现__getitem__对象列表,注入变量查找的其他命名空间集合。
level:int,可选 要遍历并添加到当前范围的先前堆栈帧数。
target:object,optional,default None
   分配目标对象。当表达式中存在变量赋值时使用。
target必须支持使用字符串键的项目赋值,如返回副本必须支持.copy()

inplace=False 返回副本或就地修改 

1.2语法:

支持的语法

  算术运算,除left shift(<<)和right shift(>>)#df + 2 * pi / s ** 4 % 42
  比较操作                                  #2 < df < df2链式比较
  布尔运算                                  #df < df2 and df3 < df4 or not df_bool

  list和tuple文字 #[1, 2](1, 2)
  属性访问        #df.a
  下标表达式      #df[0]
  简单变量评估    #pd.eval('df')

  数学函数:#sin,cos,exp,log,expm1,log1p, sqrt,sinh,cosh,tanh,arcsin,
           # arccos,arctan,arccosh, arcsinh,arctanh,abs和arctan2。

不合法语法:

   其他函数,表达式,语句;布尔表达式仅包含标量值,非bool类型或标量按位操作
   is/ 操作is not;list/ set/ dict复杂构造

执行内置复杂类型的表达式用Numexpr 库

注意:

1)DataFrame更有效地评估大对象;
2)底层引擎一次性评估大型算术和布尔表达式(默认numexpr评估)
  https://numexpr.readthedocs.io/en/latest/user_guide.html
3)NumPy和Pandas支持快速矢量化操作;对复合表达式每步骤需分配内存。
  Numexpr库按元素计算复合表达式,不用分配完整的中间数组。

使用:
  经验法则是仅eval()在拥有 DataFrame超过10,000行时才使用。
  eval() 支持引擎支持的所有算术表达式,以及仅在pandas中可用的一些扩展。
# 实例1:顶级函数pd.eval()支持的操作
df1,df2,df3,df4= (pd.DataFrame(np.random.randint(0, 10, (3, 4))) for i in range(4))

#实例1.1: 算术运算符
result = -df1 * df2 / (df3 + df4)
result= pd.eval('-df1 * df2 / (df3 + df4) ')#等价

# 实例1.2:比较运算符
pd.eval('df1 < df2 <= df3 != df4')

# 实例1.3:位操作符
pd.eval('(df1 < 0.5) & (df2 < 0.5) | (df3 < df4)')
pd.eval('(df1 < 0.5) and (df2 < 0.5) or (df3 < df4)')

# 实例1.4:对象属性和索引
pd.eval('df2.T[0] + df3.iloc[1]')

============================================================
# 实例1.5:pandas.eval()解析器
# 可用两种不同的解析器和两种不同的引擎作为后端。

# 默认'pandas'解析器允许使用更直观的语法来表达类似查询的操作(比较,连接和析取)
# 'python'引擎通常没有用, 它有点慢

expr = '(df1 > 0) & (df2 > 0) & (df3 > 0)' # &
expr = 'df1 > 0 & df2 > 0 & df3 > 0'       # 无括号
expr = 'df1 > 0 and df2 > 0 and df3 > 0'   # and

x = pd.eval(expr, parser='python')
y = pd.eval(exp, parser='pandas')
np.all(x == y)#True
# 实例2:df.eval()
# 实例2.1:按名称指定列
df= pd.DataFrame(np.random.randint(0, 10, (3, 4)),columns=list('ABCD'))

result = (df['A'] + df['B']) / (df['C'] - 1)
result = pd.eval("(df.A + df.B) / (df.C - 1)")
result = df.eval('(A + B) / (C - 1)')   # 求值表达式将列名看做变量

# 实例2.2:DataFrame.eval()中赋值
df.eval('E = (A + B) / C', inplace=True)# 创建新列D
df.eval('D = (A - B) / C', inplace=True)# 列修改

# 实例2.3:@本地变量 顶级函数直接使用

column_mean = df.mean(1)
df['A'] + column_mean
df.eval('A + @column_mean')
pd.eval('df.A + column_mean')

# 实例2.4:多行书写
df.eval("""
C = A + B
D = A - C
A = 1""", inplace=False)

# 实例2.5:局部变量名和列名相同
D=-2
df.eval('D=@D-8')
实例3:numexpr
import numexpr
df= pd.DataFrame(np.random.randint(0, 10, (3, 4)),columns=list('ABCD'))

  A B C D
0 4 8 0 5
1 7 6 5 5
2 4 8 6 7

x=df.A;y=df.B

df[(x<7) & (y>6)]                       #必须加括号
df[df.eval('A<7 and B>6')]
df.query('A<7 and B>6')
df[numexpr.evaluate('(x < 7) & (y >6)')]#所有值相同

  A B C D
0 4 8 0 5
2 4 8 6 7

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/85918442