Python:有没有更快的方法可以在for循环中对数据框进行过滤

问题描述

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

示例:

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[8],row2[9]] 
                                     for row2 in np.reshape(b,12)))#size of step_sequence
        + dvMBDown[row[0],row[5]]
        - dvMBUp[row[0],row[5]]))
print(area_name+" mb:",round((time()-t3),1),"s")

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

解决方法

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...