3

我刚刚阅读并兴奋地流口水,这些新发现的优化功能可以满足我的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"],在其上应用 a %timeit返回

每个循环 6.07 毫秒 ± 219 微秒(平均值 ± 标准偏差。7 次运行,每次 100 次循环)

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

RecursionError:超出最大递归深度

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

这是什么原因?难道我做错了什么?


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

import pandas as pd

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

df.eval('A+B')
4

1 回答 1

3

您的可复制示例中的问题是您有string。在您提供的有关高性能熊猫的链接中: eval() 和 query(),所有示例都带有浮点(或整数)。

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

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

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

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

于 2018-06-06T18:47:03.263 回答