2017-01-23 39 views
0

我必須使用double for循環來遍歷數據以將一行數據與其他行進行比較。我必須爲每一行都做到這一點。是否可以避免使用double for循環

不幸的是,我的真實數據是數百萬行,循環處理需要很長時間。

有沒有辦法避免使用double for循環?因爲我只是比較Date1和date2的相似事情 - 我想我可以groupby Thing並將double for循環應用於每個組?

但我不知道如何寫這個,因爲有一個併發症與len(分組)。還有很多行'Quantity'= 0的行,所以這些行不需要包含在計算中。在此先感謝您的幫助。

d={'Thing':['Thing1','Thing2','Thing1','Thing2','Thing5'],'Date1' : 
    ['01-01-2016','02-02-2015','03-03-2015','03-03-2015', '24-03-2016'], 'Date2' : ['04-04-2015','03-03-2014','05-04-2015','07-03-2015','03-04-2016'], 
    'Quantity':[1,1,1,1,0]} 

    data=pd.DataFrame(d) 

    data['Level']=0 

    for i in range(0,len(data)): 
     for j in range(i+1,len(data)): 
      if data['Thing'][i] == data['Thing'][j] and data['Date1'][i] >= data['Date1'][j] 
      and data['Date1'][i] < data['Date2'][j] and data['Quantity']==1: 
       data['Level'][i]=data['Level'][i]+1 
       data['Level'][j]=data['Level'][j]+1 
+2

是什麼你試圖做?什麼是代碼應該比較或更新或?.. – ForceBru

+0

經驗法則:如果你發現自己使用熊貓的for循環,你很可能做錯了什麼。 – DeepSpace

+1

首先,永遠不要在熊貓中使用正常的'for'循環,總是使用內置的迭代器,例如, 'iterrows'並用'loc'或'iloc'爲你的行索引。 – Khris

回答

3

我會嘗試進行自連接:

merged_data = data.merge(data, on='Thing', how='outer') 

的結果是這樣的:

merged_data 
     Date1_x  Date2_x Quantity_x Thing  Date1_y  Date2_y \ 
0 01-01-2016 04-04-2015   1 Thing1 01-01-2016 04-04-2015 
1 01-01-2016 04-04-2015   1 Thing1 03-03-2015 05-04-2015 
2 03-03-2015 05-04-2015   1 Thing1 01-01-2016 04-04-2015 
3 03-03-2015 05-04-2015   1 Thing1 03-03-2015 05-04-2015 
4 02-02-2015 03-03-2014   1 Thing2 02-02-2015 03-03-2014 
5 02-02-2015 03-03-2014   1 Thing2 03-03-2015 07-03-2015 
6 03-03-2015 07-03-2015   1 Thing2 02-02-2015 03-03-2014 
7 03-03-2015 07-03-2015   1 Thing2 03-03-2015 07-03-2015 
8 24-03-2016 03-04-2016   0 Thing5 24-03-2016 03-04-2016 
    Quantity_y 
0   1 
1   1 
2   1 
3   1 
4   1 
5   1 
6   1 
7   1 
8   0 

然後過濾器的,只要你喜歡:

merged_data[(...) & (...)] 
+1

(這不是一個完整的解決方案,因爲目前還不清楚你到底需要什麼,但從這個方案到完整的解決方案應該很簡單) –