2017-01-23 18 views
0

データのある行と他の行を比較するためにdouble forループを使用してデータをループする必要があります。そして、私はこの行ごとにこれを行う必要があります。double forループの使用を避けることはできますか?

残念ながら私の実際のデータは何百万行にものぼり、ループの処理には時間がかかります。

double forループを使用しないようにする方法はありますか?私は類似したもののDate1とdate2を比較することだけに興味があるので、私はグループ化することができ、それぞれのグループに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

(これは完全な解決策ではありません。なぜなら、正確に何が必要なのかが明確ではないからですが、これを完全な解決策にすることは簡単であるはずです) –