是否可以避免使用双循环

时间:2017-01-23 13:29:17

标签: python pandas for-loop group-by

我必须使用double for循环来遍历数据,以将一行数据与其他行进行比较。我必须为每一行做这件事。

不幸的是,我的真实数据是数百万行,并且循环需要很长时间才能处理。

有没有办法避免使用双循环?因为我只对比较类似事物的Date1和date2感兴趣 - 我以为我可以组合使用Thing并将双循环应用于每个组?

但我不知道如何写这个,因为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

1 个答案:

答案 0 :(得分: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[(...) & (...)]