Python 基于两个数据帧中的条件进行一对多合并
我在pandas中有两个大数据帧,例如: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
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循环来完成这个连接吗?