使用 Python Pandas 连接两个具有范围条件的表
Posted
技术标签:
【中文标题】使用 Python Pandas 连接两个具有范围条件的表【英文标题】:Join two tables with a range criteria using Python Pandas 【发布时间】:2018-04-26 04:14:00 【问题描述】:这个简化版我也有类似的问题:
实验结果保存在excel表格中,我进行了处理 使用 Python Pandas 将数据转换为 DataFrame。
下面给出两个表格: Table_Race 保存在 DataFrame 比赛中 Table_standard 保存在 DataFrame 标准中
>>> 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
例如: Jo 来自联赛 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,需要几个小时才能完成。
有更好的解决方案吗?
【问题讨论】:
上面说的是数据Jo 15
和Riko 21
,结果是Jo 21
和Riko 15
。
谢谢指出,一定是复制粘贴出错了,会改正的
【参考方案1】:
仍在研究解决方案,但这里有一些开始:
>>> 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
Merge 和 Multiple conditions 链接,了解他们的教程和缺点。
【讨论】:
我觉得应该是result.Distance >= result.Start
,这也是我的回答。以上是关于使用 Python Pandas 连接两个具有范围条件的表的主要内容,如果未能解决你的问题,请参考以下文章
基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python
pandas:将两个 DataFrame 与已排序的 MultiIndex 连接起来,使得结果具有已排序的 MultiIndex
Python使用pandas读取两个或者多个excel文件(xlsx)并进行数据连接(join)合并两个或者多个excel的信息