Python RecursionError : Simple operation crashes with Pandas.eval()

Python RecursionError : Simple operation crashes with Pandas.eval()

我刚刚读完 these newly found optimization functions 并为我的 Pandas 相关需求兴奋地流口水。根据这本书:

The DataFrame.eval() method allows much more succinct evaluation of expressions with the columns:

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

True

以我为例:

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

我的目标:将两列连接成一列。我可以用这段代码轻松地做到这一点:df_exade_light["Date"]+df_exade_light["Heure"],在其上应用 %timeit returns

6.07 ms ± 219 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

但由于某些原因df.eval('Date + Heure') returns a :

RecursionError: maximum recursion depth exceeded

此外,我应用 this thread 中找到的解决方案来提高允许的堆栈深度,但内核崩溃了。

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


问题可以用这段代码重现:

import pandas as pd

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

df.eval('A+B')

您的可重现示例中的问题是您有 string。在你给出的link中,关于High-Performance Pandas: eval() and query(),所有的例子都带有float(或int)。

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

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

默认情况下,eval 中使用的引擎根据 documentation and this engine use the library of the same name NumExpr, which is a Fast numerical expression evaluator for NumPy. Although in the previous link, an example with string is presented, it is not with the operation +. If you do df.eval('A==B') it works, same with other comparison operators, but not df.eval('A+B'). You can find more information there'numexpr' 但对于 string,除了使用 [=15] =] 似乎是有限的。

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