Вы можете попробовать использовать цикл for для достижения этой цели.Я не мог придумать его векторизованную версию.
import pandas as pd
df_0 = pd.DataFrame([[20, 27, "aspirin"], [50, 59, "trazodone"], [81, 88, "placebo"], [121, 127, "haldol"]], columns=["start_0", "end_0", "token"])
df_1 = pd.DataFrame([[0, 17], [17, 29], [29, 46], [46, 64], [64, 76], [76, 81], [81, 97], [97, 227]], columns=["start_1", "end_1"])
for i, row in df_0.iterrows():
df_1.loc[(df_1.start_1 <= row.start_0) & (df_1.end_1 >= row.end_0), 'token'] = row.token
print(df_1)
Распечатывает следующее:
start_1 end_1 token
0 0 17 NaN
1 17 29 aspirin
2 29 46 NaN
3 46 64 trazodone
4 64 76 NaN
5 76 81 NaN
6 81 97 placebo
7 97 227 haldol