我正在尝试通过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。应用())。有其他选择吗?