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