[英]Join two tables with a range criteria using Python Pandas
我有一個與此簡化版本類似的問題:
實驗結果保存在excel工作表中,我使用Python Pandas處理了數據並將其轉換為DataFrames。
下面給出了兩個表:Table_Race保存在DataFrame race中Table_standard保存在DataFrame std中
>>> data = [["Gold+",1,30,35],["Silver+",1,25,30],["Bronze+",1,20,25],["Gold",2,20,25],["Silver",2,15,20],["Bronze",2,10,15]]
>>> std = pd.DataFrame(data,columns=['Title','League','Start','End'])
>>> std
Title League Start End
0 Gold+ 1 30 35
1 Silver+ 1 25 30
2 Bronze+ 1 20 25
3 Gold 2 20 25
4 Silver 2 15 20
5 Bronze 2 10 15
>>> data = [["John",1,26],["Ryan",1,33],["Mike",1,9],["Jo",2,15],["Riko",2,21],["Kiven",2,13]]
>>> race = pd.DataFrame(data,columns=['Name','League','Distance'])
>>> race
Name League Distance
0 John 1 26
1 Ryan 1 33
2 Mike 1 9
3 Jo 2 21
4 Riko 2 15
5 Kiven 2 13
>>>
我想檢查每個球員的距離,並根據標准獲得他們的頭銜:
Title <= distance in [start, end) and need to match league
例如:來自聯賽2的喬,距離15在[15,20]之間。 請注意,它不是[10,15),因此他獲得了標題“銀”
預期結果如下:
Name League Distance Title
John 1 26 Silver+
Ryan 1 33 Gold+
Mike 1 9 N/A
Jo 2 21 Gold
Riko 2 15 Silver
Kiven 2 13 Bronze
我可以使用兩個循環來實現此目的,這兩個循環基本上從Table_race獲取每個距離,並從種族的每一行(聯賽,距離)中搜索(l,d)
尋找條件:
l == League && d >= Start && d < End
但是此方法的速度為O(N ^ 2),它太慢了,因為我的數據很容易超過100,000,這需要數小時才能完成。
有更好的解決方案嗎?
仍在研究解決方案,但這里是一些開始:
>>> data = [["Gold+",1,30,35],["Silver+",1,25,30],["Bronze+",1,20,25],["Gold",2,20,25],["Silver",2,15,20],["Bronze",2,10,15]]
>>> std = pd.DataFrame(data,columns=['Title','League','Start','End'])
>>> std
Title League Start End
0 Gold+ 1 30 35
1 Silver+ 1 25 30
2 Bronze+ 1 20 25
3 Gold 2 20 25
4 Silver 2 15 20
5 Bronze 2 10 15
>>> data = [["John",1,26],["Ryan",1,33],["Mike",1,9],["Jo",2,21],["Riko",2,15],["Kiven",2,13]]
>>> race = pd.DataFrame(data,columns=['Name','League','Distance'])
>>> race
Name League Distance
0 John 1 26
1 Ryan 1 33
2 Mike 1 9
3 Jo 2 21
4 Riko 2 15
5 Kiven 2 13
>>> result=pd.merge(race,std,on='League')
>>> result = result[(result.Distance >= result.Start)&(result.Distance < result.End)][["Name","League","Distance","Title"]]
>>> result
Name League Distance Title
1 John 1 26 Silver+
3 Ryan 1 33 Gold+
9 Jo 2 21 Gold
13 Riko 2 15 Silver
17 Kiven 2 13 Bronze
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.