2017-01-23 85 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

(这不是一个完整的解决方案,因为目前还不清楚你到底需要什么,但从这个方案到完整的解决方案应该很简单) –