簡體   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