在列中交换值时删除重复项并给出计数
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
我有一个像这样的 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