小编典典
这个答案潜入各种特性和功能的提供pd.eval,df.query和df.eval。
设置
示例将涉及这些DataFrame(除非另有说明)。
np.random.seed(0)
df1 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))
df3 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))
df4 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))
pandas.eval -《失踪手册》
注意
在所讨论的三个功能中,pd.eval最为重要。df.eval并在幕后df.query打电话 pd.eval。行为和用法在这三个功能上或多或少是一致的,有些语义上的细微变化将在后面强调。本节将介绍所有这三个功能共有的功能-包括(但不限于)允许的语法,优先级规则和关键字参数。
pd.eval可以评估由变量和/或文字组成的算术表达式。这些表达式必须作为字符串传递。因此,要回答上述问题,你可以
x = 5
pd.eval("df1.A + (df1.B * x)")
这里要注意一些事情:
整个表达式是一个字符串
df1,df2和x引用全局命名空间中的变量,这些变量是eval在解析表达式时通过选择的
使用属性访问器索引访问特定的列。你也可以使用"df1['A'] + (df1['B'] * x)"达到相同的效果。
我将在解释以下target=...属性的部分中讨论重新分配的特定问题。但是现在,这是使用以下命令进行有效操作的更简单示例pd.eval:
pd.eval("df1.A + df2.A") # Valid, returns a pd.Series object
pd.eval("abs(df1) ** .5") # Valid, returns a pd.DataFrame object
…等等。还以相同方式支持条件表达式。下面的语句都是有效表达式,将由引擎进行评估。
pd.eval("df1 > df2")
pd.eval("df1 > 5")
pd.eval("df1 < df2 and df3 < df4")
pd.eval("df1 in [1, 2, 3]")
pd.eval("1 < 2 < 3")
可以在文档中找到详细列出所有受支持的功能和语法的列表。综上所述,
除左移(<>)运算符外的算术运算,例如df + 2 * pi / s ** 4 % 42-the_golden_ratio
比较操作,包括链式比较,例如 2 < df < df2
布尔运算(例如df < df2 and df3 < df4或)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,arcosh,arcsinh,arctanh,abs和arctan2。
文档的此部分还指定了不支持的语法规则,包括set/ dict文字,if-else语句,循环和理解以及生成器表达式。
从列表中可以明显看出,你还可以传递涉及索引的表达式,例如
pd.eval('df1.A * (df1.index > 1)')
解析器选择:parser=…参数
pd.eval解析表达式字符串以生成语法树时,支持两种不同的解析器选项