对于我Pandas
相关的需求,我刚刚阅读并对these newly found optimization functions感到兴奋。根据这本书:
DataFrame.eval()方法允许使用列更简洁地评估表达式:
result3 = df.eval('(A + B) / (C - 1)')
np.allclose(result1, result3)
真
以我的例子:
我的数据框包含大约42000条记录和28列。其中两个是Date
和Heure
,它们是字符串。
我的目标:将两个列连接成一个。我可以轻松处理这段代码: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')
答案 0 :(得分:1)
您的可复制示例中的问题是您有字符串。在您提供的关于High-Performance Pandas: eval() and query()的链接中,所有示例都包含 float (或int)。
使其适用于您的示例的一种方法是使用python作为引擎:
df.eval('A+B',engine='python')
默认情况下,根据documentation,eval
中使用的引擎为'numexpr'
,此引擎使用同名的库NumExpr,这是 NumPy的快速数值表达式评估器。虽然在上一个链接中,显示了一个带字符串的示例,但它不是使用 + 操作。如果你df.eval('A==B')
它可以工作,与其他比较运算符相同,但不是df.eval('A+B')
。你可以找到更多信息there但是对于字符串,除了使用engine='python'
之外,它似乎有限。
使用日期和时间类型回到原始问题,不确定您是否可以找到使用默认引擎(see here for supported datatype)的解决方案