Python 基于两个数据帧中的条件进行一对多合并

Python 基于两个数据帧中的条件进行一对多合并,python,pandas,dataframe,Python,Pandas,Dataframe,我在pandas中有两个大数据帧,例如: import pandas as pd df = pd.DataFrame({'start' : [5, 10, 15, 20], 'stop' : [10, 20, 30, 40]}) df2 = pd.DataFrame({'id':[6, 7, 8, 12, 13, 17, 19, 38, 39, 40]}) 如果id在范围(开始,停止)内,我想以一种方式将它们合并到第三个数据帧中,将start和stop添加到第三个数据帧中,如下所示: d

我在pandas中有两个大数据帧,例如:

import pandas as pd
df = pd.DataFrame({'start' : [5, 10, 15, 20], 'stop' : [10, 20, 30, 40]})   
df2 = pd.DataFrame({'id':[6, 7, 8, 12, 13, 17, 19, 38, 39, 40]})
如果
id
范围(开始,停止)
内,我想以一种方式将它们合并到第三个数据帧中,将
start
stop
添加到第三个数据帧中,如下所示:

df3 = pd.DataFrame({'id':[6, 7, 8, 12, 13, 17, 19, 25, 38, 39, 40], 'start':[5, 5, 5, 10, 10, 10, 10, 20, 30, 30, 30], 'stop':[10, 10, 10, 20, 20, 20, 20, 30, 40, 40, 40]})
我试过这个:

df3['start'] = pd.Series([0 for i in range(0, len(df2['id']))])
df3['stop'] = pd.Series([0 for i in range(0, len(df2['id']))])
for i in range(0, len(df2['id'])):
    if df['start'][i] < df1['id'][i] < df['stop'][i]:
        df['start'][i] = df3['start'][i]
        df['stop'][i] = df3['stop'][i]
df3['start']=pd.系列([0表示范围内的i(0,len(df2['id'])))
df3['stop']=pd.系列([0表示范围内的i(0,len(df2['id']))]))
对于范围(0,len)(df2['id'])中的i:
如果df['start'][i]

但这给了我一个错误。有人能指出我哪里出了问题,以及如何获得所需的数据帧吗?另外,是否总是需要像我上面所做的那样,使用
pd.Series
初始化一个新变量?谢谢

假设
df2
已排序,您可以使用
searchsorted

df2.join(df.iloc[df.stop.searchsorted(df2.id)].set_index(df2.index))

    id  start  stop
0    6      5    10
1    7      5    10
2    8      5    10
3   12     10    20
4   13     10    20
5   17     10    20
6   19     10    20
7   25     15    30
8   38     20    40
9   39     20    40
10  40     20    40

或者我们可以引用底层numpy数组并执行相同的逻辑

stop = df.stop.values
ids = df2.id.values
v = df.values

pd.DataFrame(
    np.column_stack([
        ids, v[stop.searchsorted(ids)]
    ]),
    columns=['id', 'start', 'stop']
)

    id  start  stop
0    6      5    10
1    7      5    10
2    8      5    10
3   12     10    20
4   13     10    20
5   17     10    20
6   19     10    20
7   25     15    30
8   38     20    40
9   39     20    40
10  40     20    40

假设
df2
已排序,则可以使用
searchsorted

df2.join(df.iloc[df.stop.searchsorted(df2.id)].set_index(df2.index))

    id  start  stop
0    6      5    10
1    7      5    10
2    8      5    10
3   12     10    20
4   13     10    20
5   17     10    20
6   19     10    20
7   25     15    30
8   38     20    40
9   39     20    40
10  40     20    40

或者我们可以引用底层numpy数组并执行相同的逻辑

stop = df.stop.values
ids = df2.id.values
v = df.values

pd.DataFrame(
    np.column_stack([
        ids, v[stop.searchsorted(ids)]
    ]),
    columns=['id', 'start', 'stop']
)

    id  start  stop
0    6      5    10
1    7      5    10
2    8      5    10
3   12     10    20
4   13     10    20
5   17     10    20
6   19     10    20
7   25     15    30
8   38     20    40
9   39     20    40
10  40     20    40

值17适合两个raings(10-20)和(15,30),你只想要一个记录吗?是的,我想要它处于较低的(开始,停止)范围值17适合两个raings(10-20)和(15,30),你只想要一个记录吗?是的,我想要它处于较低的(开始,停止)范围嗨!谢谢你的回答!如果
df
有更多的列,而我只想将
start
stop
从它添加到
df3
,会怎么样。也可以像我尝试的那样使用for循环来完成此连接吗?嗨!谢谢你的回答!如果
df
有更多的列,而我只想将
start
stop
从它添加到
df3
,会怎么样。也可以像我尝试的那样使用for循环来完成这个连接吗?