熊猫加入了前任

时间:2017-09-12 16:06:41

标签: python pandas join dataframe merge

我将通过一个例子描述我的问题:

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

我知道我需要在行列上进行某种特殊的合并,但我不知道如何表达它。

1 个答案:

答案 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