使用 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 15Riko 21,结果是Jo 21Riko 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 &gt;= result.Start,这也是我的回答。

以上是关于使用 Python Pandas 连接两个具有范围条件的表的主要内容,如果未能解决你的问题,请参考以下文章

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python

只外连接 python pandas

pandas:将两个 DataFrame 与已排序的 MultiIndex 连接起来,使得结果具有已排序的 MultiIndex

Python使用pandas读取两个或者多个excel文件(xlsx)并进行数据连接(join)合并两个或者多个excel的信息

日期时间范围之间的 Python Pandas 累积列

按 ID 合并两个 Excel 文件并合并具有相同名称的列(python、pandas)