Python 非唯一值上的自联接

Python 非唯一值上的自联接,python,pandas,dataframe,Python,Pandas,Dataframe,我有下表: ind_ID pair_ID orig_data 0 A 1 W 1 B 1 X 2 C 2 Y 3 D 2 Z 4 A 3 W 5 C 3 X

我有下表:

       ind_ID  pair_ID orig_data
0           A        1         W 
1           B        1         X
2           C        2         Y
3           D        2         Z
4           A        3         W          
5           C        3         X          
6           B        4         Y          
7           D        4         Z          
每一行都有一个
单独的ID
,以及一个与另一行共享的
对ID
。我想做一个自连接,这样每一行都有它的原始数据,并且它与之共享一个
pair\u ID

       ind_ID  pair_ID orig_data partner_data
0           A        1         W            X
1           B        1         X            W
2           C        2         Y            Z
3           D        2         Z            Y
4           A        3         W            X
5           C        3         X            W
6           B        4         Y            Z
7           D        4         Z            Y
我试过:

df.join(df, on='pair_ID')
但显然,由于
pair\u ID
值不是唯一的,我得到:

       ind_ID  pair_ID orig_data partner_data
0           A        1         W          NaN
1           B        1         X          NaN
2           C        2         Y          NaN
3           D        2         Z          NaN
4           A        3         W          NaN
5           C        3         X          NaN
6           B        4         Y          NaN
7           D        4         Z          NaN 
我还考虑过创建一个新列,将
ind\u ID+pair\u ID
连接起来,这将是唯一的,但是连接将不知道匹配什么

是否可以在
pair\u ID
上进行自联接,其中每一行都与自身不匹配的匹配行联接?

在您的情况下(只有两对)-您可能只需按ID分组并进行变换,只需颠倒组中值的顺序,例如:

df.loc[:, 'partner_data'] = df.groupby('pair_ID').orig_data.transform(lambda L: L[::-1])
这给了你:

  ind_ID  pair_ID orig_data partner_ID
0      A        1         W          X
1      B        1         X          W
2      C        2         Y          Z
3      D        2         Z          Y
4      A        3         W          X
5      C        3         X          W
6      B        4         Y          Z
7      D        4         Z          Y

是用
apply做的,但性能最差(你的解决方案是8ms vs 2ms)
df['partner_ID']=df.apply(lambda x:df[(df.index!=x.name)&(df.pair_ID==x.pair_ID)]。orig_data.values[0],axis='columns')
这也是我的第一直觉。。。。我想不出更好的办法了。