在忽略顺序的多列上合并数据框

Ali*_*Ali 1 merge python-3.x pandas

我有以下数据框:

df1=pd.DataFrame({'fr':[1,2,3],'to':[4,5,6],'R':[0.1,0.2,0.3]})
df2=pd.DataFrame({'fr':[1,5,3],'to':[4,2,6],'X':[0.4,0.5,0.6]})
Run Code Online (Sandbox Code Playgroud)

我想在 fr 和 to 上合并这两个数据帧,忽略 fr 和 to 的顺序,即(2,5)与(5,2)相同。所需的输出是:

dfO=pd.DataFrame({'fr':[1,2,3],'to':[4,5,6],'R':[0.1,0.2,0.3],'X':[0.4,0.5,0.6]})
Run Code Online (Sandbox Code Playgroud)

或者

dfO=pd.DataFrame({'fr':[1,5,3],'to':[4,2,6],'R':[0.1,0.2,0.3],'X':[0.4,0.5,0.6]})
Run Code Online (Sandbox Code Playgroud)

我可以执行以下操作:

pd.merge(df1,df2,on=['fr','to'],how='left')
Run Code Online (Sandbox Code Playgroud)

然而,正如预期的那样,第二行的 X 值是 NaN。

感谢您的帮助。

WeN*_*Ben 7

你需要做的numpy sort第一

df1[['fr','to']] = np.sort(df1[['fr','to']].values,1)
df2[['fr','to']] = np.sort(df2[['fr','to']].values,1)
out = df1.merge(df2,how='left')
out
Out[44]: 
   fr  to    R    X
0   1   4  0.1  0.4
1   2   5  0.2  0.5
2   3   6  0.3  0.6
Run Code Online (Sandbox Code Playgroud)