Python: 有没有更快的方法在 for 循环中过滤数据框
Python: Is there a faster way to filter on dataframe in a for loop
我在 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[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")
这是我正在制定的约束条件,它 return 超过 100k 个约束条件。 运行 线程处理此代码需要 40 分钟。该过滤器有助于 return 减少 solver.sum() 中循环 运行 的数据。
有没有更快的方法来过滤 for 循环内的值?
(这是为了创建 docplex 约束而完成的)
谢谢
我能够使它快 18 倍,主要时间花在过滤器 (.loc()) 上。首先,我将索引从多索引更新为单个索引,它连接了所有索引列。这导致 3 倍的速度提升。然后我将我的数据框更改为字典,这导致总速度提高了 15 倍。现在我可以在 3 分钟而不是 45 分钟内创建模型约束。此外,我已经在 1 个以上的索引中进行线程处理(并行处理)。通常我没有看到使用 add_constrains() 的速度有显着提高,但有时它会有所帮助。
50k 约束在 3 分钟内形成 600k 行的数据
如果需要我可以分享逻辑
我在 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[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")
这是我正在制定的约束条件,它 return 超过 100k 个约束条件。 运行 线程处理此代码需要 40 分钟。该过滤器有助于 return 减少 solver.sum() 中循环 运行 的数据。 有没有更快的方法来过滤 for 循环内的值? (这是为了创建 docplex 约束而完成的) 谢谢
我能够使它快 18 倍,主要时间花在过滤器 (.loc()) 上。首先,我将索引从多索引更新为单个索引,它连接了所有索引列。这导致 3 倍的速度提升。然后我将我的数据框更改为字典,这导致总速度提高了 15 倍。现在我可以在 3 分钟而不是 45 分钟内创建模型约束。此外,我已经在 1 个以上的索引中进行线程处理(并行处理)。通常我没有看到使用 add_constrains() 的速度有显着提高,但有时它会有所帮助。 50k 约束在 3 分钟内形成 600k 行的数据 如果需要我可以分享逻辑