我有一个pandas数据帧df。它有列setid、id和label。我想成对比较id标签值。我已经尝试过进行如下所示的自连接,但这最终会为id的每个排列提供额外的记录。我只想为id的每一个不同组合提供一个记录。我在下面用数据勾勒出了一些例子,以说明我试图实现的目标。有人能提出巧妙的方法吗?
df
setid id label
1 1 a
1 2 b
如果我在setid 上加入它
import pandas as pd
pd.merge(df,df, how='inner', on=['setid']).head()
setid id_x id_y label_x label_y
1 1 1 a a
1 1 2 a b
1 2 2 b b
1 2 1 b a
但我只想要id的每个组合的一个版本,例如下面的输出
setid id_x id_y label_x label_y
1 1 1 a a
1 1 2 a b
1 2 2 b b
您可以使用np.sort
df1=pd.merge(df,df, how='inner', on=['setid']).head()
df1[['label_x', 'label_y']]=np.sort(df1.filter(like='label').values, axis=1)
df1=df1.drop_duplicates(subset=['label_x','label_y'])
df1