Python RecursionError : Simple Operations 在 Pandas.eval() 時會



我刚刚阅读了这些新发现的优化函数,并兴奋地流口水,以满足我的Pandas相关需求。根据这本书:

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')返回一个:

递归错误:超出最大递归深度

更重要的是,我应用在此线程中找到的解决方案来提高允许的堆栈深度,但内核只是崩溃。

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


可以使用以下代码重现该问题:

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

可复制示例中的问题是您有字符串。在你给出的关于高性能Pandas的链接中:eval((和query((,所有的例子都带有float(或int(。

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

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

默认情况下,eval中使用的引擎是根据文档'numexpr'的,并且此引擎使用同名的库NumExpr,它是 NumPy 的快速数值表达式计算器。尽管在上一个链接中,给出了一个带有字符串的示例,但它不是操作+。如果您这样做df.eval('A==B')它的工作原理与其他比较运算符相同,但不能df.eval('A+B').您可以在那里找到更多信息,但对于字符串,除了使用engine='python'之外,它似乎有限。

回到日期和时间类型的原始问题,不确定是否可以找到使用默认引擎的解决方案(有关支持的数据类型,请参阅此处(

相关内容

  • 没有找到相关文章