我必须使用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
答案 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[(...) & (...)]