我将通过一个例子描述我的问题:
x = pd.DataFrame.from_dict({'row':[5, 10, 12], 'val_x': [11,222, 333]})
y = pd.DataFrame.from_dict({'row':[2, 4, 9, 13], 'val_y': [1, 12, 123, 4]})
In [4]: x
row val_x
0 5 11
1 10 222
2 12 333
In [5]: y
row val_y
0 2 1
1 4 12
2 9 123
3 13 4
我希望x
中的每一行都与y
中的一行连接,即根据行列(也允许等值)紧接其前一行
换句话说,输出看起来像
row val_x row_y val_y
0 5 11 4 12
1 10 222 9 123
2 12 333 9 123
我知道我需要在行列上进行某种特殊的合并,但我不知道如何表达它。
答案 0 :(得分:1)
尝试使用pd.merge_asof
pd.merge_asof(x,y,on='row',direction ='backward').merge(y,left_on='val_y',right_on='val_y')
Out[828]:
row_x val_x val_y row_y
0 5 11 12 4
1 10 222 123 9
2 12 333 123 9
编辑:
from itertools import product
import pandas as pd
DF=pd.DataFrame(list(product(x.row, y.row)), columns=['l1', 'l2'])
DF['DIFF']=DF.l1-DF.l2
DF=DF.loc[DF.DIFF>=0,:]
DF=DF.sort_values(['l1','DIFF']).drop_duplicates(['l1'],keep='first')
x.merge(DF,left_on='row',right_on='l1',how='left').merge(y,left_on='l2',right_on='row')[['row_x','val_x','row_y','val_y']]
row_x val_x row_y val_y
0 5 11 4 12
1 10 222 9 123
2 12 333 9 123