与使用eval()的pd.apply相比,熊猫性能有所提高

时间:2019-08-07 00:00:13

标签: python pandas dataframe eval

我正在尝试通过Pandas优化脚本性能。我遇到了一个障碍,我需要在DataFrame上应用大量过滤器,并从结果中存储一些总数。

目前,实现这一目标的最快方法是在过滤器列表(作为字符串)上运行For Loop,并使用eval()计算总数:

for filter_str in filter_list:
    data_filtered = data[eval(filter_str)]
    avg_change = data_filtered['NewChangePerc'].mean()

这是我尝试使用pd.apply()加快速度的尝试,因为我想不出矢量化的方式来实现它(这次过滤器位于DataFrame中而不是列表中):

def applying(x):
    f = data[eval(x)]
    avg_change = f['NewChangePerc'].mean()

filter_df.processed.apply(applying)

主要目标是简单地使其尽可能快。我不明白的是为什么For循环比pd.apply()更快。大约快一倍。

任何输入将不胜感激。


更新 以下是有关我要完成的工作的更多详细信息:

获取大约67列和2500行的数据集。

       Code                              Name    ...         Price NewChangePerc
0   JOHNS33                  Johnson, Matthew    ...          0.93      0.388060
1   QUEST01                   Questlove, Inc.    ...         18.07      0.346498
2   773NI01                 773 Entertainment    ...          1.74      0.338462
3   CLOVE03                  Cloverfield, Sam    ...         21.38      0.276418
4   KITET08                       Kite Teal 6    ...          0.38      0.225806

然后获取过滤器列表。

['Price > 5.0', 'NewChangePerc < .02']

将每个过滤器应用于数据并计算某些值,例如平均NewChangePerc。

例如,当应用“价格> 5.0”时,平均NewChangePerc将为〜0.31。

现在将过滤器列表的长度增加到大约1000,并且开始需要一些时间来运行。我需要尽可能减少时间。我已经没有足够的想法了,找不到上面列出的解决方案,但是它们太慢了(对于使用For Loop的50个过滤器,约为0.86s;对于使用pd的50个过滤器,约为1.65s。应用())。有其他选择吗?

0 个答案:

没有答案