簡體   English   中英

有沒有一種繞過嵌套for循環的有效方法?

[英]Is there a efficient way to bypass a nested for loop?

我有一個嵌套的for循環,我想知道是否有更有效的方法來執行此操作,代碼方面:

我的數據類似於以下內容。

  ID  | DEAD     | 2009-10 | ...    | 2016-10
 -----------------------------------------
  1   | 2018-11  | 5.4     | ...    | 6.5 
  2   | 2014-01  | 0.5     | ...    | 5.2
  ...                      
  N   | 2008-11  | 8.6     | ...    | 1.3

目標是在產品到期時立即用np.NaN替換值(當列'DEAD'<日期時),否則值應保持不變。

  ID  | DEAD     | 2009-10 | ...    | 2016-10
 -----------------------------------------
  1   | 2018-11  | 5.4     | ...    | 6.5 
  2   | 2014-01  | 0.5     | ...    | NaN
  ...                      
  N   | 2008-11  | 8.6     | ...    | NaN

我最初的想法是應用嵌套的for循環來檢查是否達到條件'DEAD' < date 該方法適用於較小的N.但由於我的數據包括超過20,000行和400列,因此需要太多時間。

time = df.columns[2:] # take the header as an index
time = pd.DataFrame(time)
time.columns = ['Dummy']
time['Dummy'] = pd.to_datetime(time.Dummy) # Convert index argument to datetime

df['DEAD'] = pd.to_datetime(tore.DEAD) # Convert column 'DEAD' to datetime



lists = []
for i in range(397):
    row = []
    for j in range(20000):
        if time.iloc[i,0] <= df.iloc[j,0]: 
            newlist = df.iloc[j,i]
        else:
            newlist = np.NaN
        row.append(newlist)
    lists.append(row)

lists = pd.DataFrame(lists)
lists = lists.transpose()

感謝任何建議!

您可以嘗試迭代每列:

for column_name in df.drop('DEAD', axis=1):
   column_date = pd.to_datetime(column_name)
   df[column_name].mask(df['DEAD']<column_date, inplace=True)

掩碼方法在這里也很有用。

如果您的列是有序的 - 例如,按日期升序 - 那么您可以避免一些循環和檢查。

  • 對於每一行,找到符合條件的第一列
    • 如果您真的想要優化,可以使用二進制搜索來完成此操作
  • 獲取此列的索引; 叫它i
  • index >= i所有后續列更新為NaN

更新本身仍然是逐個單元地完成的,這可能不是特別好。

如果您創建第二個具有相同維度的數據幀(如位掩碼),則可能會獲得更好的性能,其中包含01值,指示是否應保留或刪除基礎數據幀中的值。

如果這些數據存儲在數據庫中,您應該直接使用sql,更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM