繁体   English   中英

Python:是否有更快的方法在 for 循环中过滤 dataframe

[英]Python: Is there a faster way to filter on dataframe in a for loop

我在 python 的一个元组上有一个 for 循环,它是一个 dataframe 的索引。 然后将索引下的所有值相加。

例子:

t3 = time()
for row in list_of_index:
    a=[]
    if row[-1]!='end':
        a=df1.loc[row[:7]].to_numpy()
    b=df2.loc[row[:6]].to_numpy()
    print(solver.add_constraint(solver.sum(dvSupportedOuts[row[0], row[6],row[1], 
 row2[0],row[2],row2[1],row2[2],row[3],row[4] ,row2[3],row[5],row2[4],row2[5],row2[6] ,row2[7],row2[8]] 
                                     for row2 in np.reshape(a, (-1, 11))) 
        ==                solver.sum(dvSupportedOuts[row[0], row2[0], row[1], 
                                     row[2], row2[1],row[3],row[4],row2[2],row2[3],row[5],row2[4],row2[5],row2[6],row2[7],row2[8],row2[9]] 
                                     for row2 in np.reshape(b, (-1, 12)))#size of step_sequence
        + dvMBDown[row[0], row[6], row[1], row[2],row[3],row[4],row[5]]
        - dvMBUp[row[0], row[6], row[1], row[2],row[3],row[4],row[5]]))
print(area_name+" mb:", round((time()-t3), 1), "s")

这是我正在制定的约束,它返回超过 100k 的约束。 在线程化时运行此代码需要 40 分钟。 过滤器有助于为在solver.sum() 中运行的循环返回更少的数据。 有没有更快的方法来过滤 for 循环中的值? (这是为创建 docplex 约束而完成的)谢谢

我能够让它快 18 倍,主要时间花在过滤器 (.loc()) 上。 首先,我将我的索引从多索引更新为单个索引,该索引是所有索引列的连接。 这导致速度提高了 3 倍。 然后我将我的 dataframe 更改为字典,它导致总速度提高了 15 倍。 现在我可以在 3 分钟而不是 45 分钟内创建 model 约束。 此外,我已经在索引的 1 上对它进行了线程化(并行处理)。 通常我没有看到使用 add_constrains() 显着提高速度,但有时它会有所帮助。 50k 约束在 3 分钟内形成 600k 行的数据如果需要,我可以分享逻辑

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM