![](/img/trans.png)
[英]Efficient way to perform if condition nested in for loop in python
[英]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
值 更新本身仍然是逐個單元地完成的,這可能不是特別好。
如果您創建第二個具有相同維度的數據幀(如位掩碼),則可能會獲得更好的性能,其中包含0
和1
值,指示是否應保留或刪除基礎數據幀中的值。
如果這些數據存儲在數據庫中,您應該直接使用sql,更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.