Python 熊猫在两个数据帧中通过重叠范围合并

Python 熊猫在两个数据帧中通过重叠范围合并,python,pandas,merge,range,Python,Pandas,Merge,Range,鉴于以下情况: import pandas as pd a=pd.DataFrame({' ID':[1,1,2,2],'a.A':[1,5,10,15],'a.B':[3,8,13,18]}) b=pd.DataFrame({' ID':[1,1,2,2],'b.A':[2,2,14,18],'b.B':[3,2,15,20]}) a ID a.A a.B 0 1 1 3 1 1 5 8 2 2 10 13 3 2

鉴于以下情况:

import pandas as pd
a=pd.DataFrame({' ID':[1,1,2,2],'a.A':[1,5,10,15],'a.B':[3,8,13,18]})
b=pd.DataFrame({' ID':[1,1,2,2],'b.A':[2,2,14,18],'b.B':[3,2,15,20]})
a
    ID  a.A     a.B
0   1     1     3
1   1     5     8
2   2     10    13
3   2     15    18

b
    ID  b.A     b.B
0   1     2     3
1   1     2     2
2   2     14    15
3   2     18    20
我需要左连接b到a,其中a.a到a.b的范围与给定ID号的b.a到b.b的范围重叠。逻辑也可以这样解释: 如果ID在a和b之间匹配,则如果(a.a=b.a)或(a.a=b.b),则匹配

最终结果如下所示:

    ID   a.A     a.B    b.A   b.B
0   1      1       3     2      3
1   1      1       3     2      2
2   1      5       8        
3   2     10      13        
4   2     15      18    18     20
5   2     15      18    18     20

提前谢谢

不确定这是最佳解决方案,但这可能是一个良好的开端:

import pandas as pd
a=pd.DataFrame({' ID':[1,1,2,2],'a.A':[1,5,10,15],'a.B':[3,8,13,18]})
b=pd.DataFrame({' ID':[1,1,2,2],'b.A':[2,2,14,18],'b.B':[3,2,15,20]})

c = a.merge(b)
cbAB = (c["a.A"] <= c["b.A"]) & (c["a.B"] >= c["b.A"]) | (c["a.A"] <= c["b.B"]) & (c["a.B"] >= c["b.B"])
cb = c[["b.A","b.B"]]
cb = cb[cbAB]
c[["b.A","b.B"]] = cb

c = c.drop_duplicates()

这是您想要的正确输出吗?我对4号线没有把握。请看我的回答。两个回答都很好。我可能会在NaN处删除b.A,而不是使用删除重复项,以防两列中有多个匹配项的数字相同。非常感谢你们两位!
>>> c
    ID  a.A  a.B  b.A  b.B
0    1    1    3    2    3
1    1    1    3    2    2
2    1    5    8  NaN  NaN
4    2   10   13  NaN  NaN
6    2   15   18   14   15
7    2   15   18   18   20
import pandas as pd
import numpy as np
a=pd.DataFrame({' ID':[1,1,2,2],'a.A':[1,5,10,15],'a.B':[3,8,13,18]})
b=pd.DataFrame({' ID':[1,1,2,2],'b.A':[2,2,14,18],'b.B':[3,2,15,20]})

c = a.merge(b, on=' ID', how='left')
range_overlaps = (
    ((c['a.A'] <= c['b.A']) & (c['a.B'] >= c['b.A'])) |
    ((c['a.A'] <= c['b.B']) & (c['a.B'] >= c['b.B']))
)
c.loc[~range_overlaps, ['b.A', 'b.B']] = np.nan
c = c.drop_duplicates()
c = c.reset_index(drop=True)

print(c)
    ID  a.A  a.B   b.A   b.B
0    1    1    3   2.0   3.0
1    1    1    3   2.0   2.0
2    1    5    8   NaN   NaN
3    2   10   13   NaN   NaN
4    2   15   18  14.0  15.0
5    2   15   18  18.0  20.0