在列中交换值时删除重复项并给出计数

Remove duplicates when values are swapped in columns and give a count

我有一个像这样的 DataFrame:

Col1 Col2 Score
A B 0.6
A B 0.6
B A 0.6
A C 0.8
C A 0.8
D E 0.9

即使在 col1 和 col2 中交换了值,我也想删除所有重复项并计算此类次数。

我知道我们可以用

删除它
df.drop_duplicates()

对于交换值但含义相同的情况,我将创建一个临时列 [col1,col2] 并按升序重新排列列表以使用上面的重复方法再次删除它。

我也需要计算所有这些重复项。有一个更好的方法吗?生成的 DataFrame 应该是这样的:

Col1 Col2 Duplicates Score
A B 3 0.6
A C 2 0.8
D E 1 0.9

IIUC,你可以使用 frozenset 作为石斑鱼:

group = df[['Col1', 'Col2']].agg(frozenset, axis=1)

(df
 .groupby(group, as_index=False)  # you can also group by [group, 'Score']
 .agg(**{c: (c, 'first') for c in df},
      Duplicates=('Score', 'count'),
     )
)

输出:

  Col1 Col2  Score  Duplicates
0    A    B    0.6           3
1    A    C    0.8           2
2    D    E    0.9           1

这是使用 np.sort

的替代方法
df[['Col1','Col2']] = np.sort(df[['Col1','Col2']].to_numpy(),axis=1)

(df.groupby(['Col1','Col2']).agg(
    Count = ('Score','count'),
    Score = ('Score','first'))
 .reset_index())

输出:

  Col1 Col2  Count  Score
0    A    B      3    0.6
1    A    C      2    0.8
2    D    E      1    0.9