我有下表:
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
每一行都有一个individual_ID
和一个pair_ID
,它与另一行完全共享。我想进行自我连接,以便每一行都有其原始数据,并且它共享pair_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_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_ID+pair_ID
的新列,这个列是唯一的,但是连接不会知道要匹配的内容。
是否可以在pair_ID
上进行自联接,其中每一行都与不属于自己的匹配行连接?
答案 0 :(得分:3)
在你的情况下(只有两对) - 你可以根据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