Python RecursionError:使用Pandas.eval()简单操作崩溃

时间:2018-06-06 16:57:27

标签: python python-3.x pandas eval numexpr

对于我Pandas相关的需求,我刚刚阅读并对these newly found optimization functions感到兴奋。根据这本书:

  

DataFrame.eval()方法允许使用列更简洁地评估表达式:

result3 = df.eval('(A + B) / (C - 1)') 
np.allclose(result1, result3)
  

以我的例子:

我的数据框包含大约42000条记录和28列。其中两个是DateHeure,它们是字符串。

我的目标:将两个列连接成一个。我可以轻松处理这段代码:df_exade_light["Date"]+df_exade_light["Heure"],在其上应用%timeit返回

  

每循环6.07 ms±219μs(平均值±标准偏差,7次运行,每次100次循环)

但由于某种原因,df.eval('Date + Heure')会返回:

  

RecursionError:超出最大递归深度

更重要的是,我应用this thread中的解决方案来提高允许的堆栈深度,但内核崩溃了。

这是什么原因?我做错了吗?

使用此代码可以重现问题:

import pandas as pd

df = pd.DataFrame({'A': ['X','Y'],
                   'B': ['U','V']})

df.eval('A+B')

1 个答案:

答案 0 :(得分:1)

您的可复制示例中的问题是您有字符串。在您提供的关于High-Performance Pandas: eval() and query()的链接中,所有示例都包含 float (或int)。

使其适用于您的示例的一种方法是使用python作为引擎:

df.eval('A+B',engine='python')

默认情况下,根据documentationeval中使用的引擎为'numexpr',此引擎使用同名的库NumExpr,这是 NumPy的快速数值表达式评估器。虽然在上一个链接中,显示了一个带字符串的示例,但它不是使用 + 操作。如果你df.eval('A==B')它可以工作,与其他比较运算符相同,但不是df.eval('A+B')。你可以找到更多信息there但是对于字符串,除了使用engine='python'之外,它似乎有限。

使用日期时间类型回到原始问题,不确定您是否可以找到使用默认引擎(see here for supported datatype)的解决方案