查找 2 列之间的重复项(独立顺序),计数并删除 Python

Find duplicates between 2 columns (independent order) , count and drop Python

我正在尝试查找 2 列之间的重复项,顺序是独立的,但我需要在删除它们后保留重复项的计数

df = pd.DataFrame([['A','B'],['D','B'],['B','A'],['B','C'],['C','B']],
              columns=['source', 'target'],
              )

这是我的预期结果

    source  target   count
0     A       B        2
1     D       B        1
3     B       C        2

我已经尝试了几种方法,但我无法接近解决方案。

保持哪种组合并不重要。在结果示例中,我保留了第一个。

您可以使用 df.duplicated() 来查看哪些是重复的,如果项目是重复的,则输出是 true,如果不是,则输出是 false。有关更多信息和实际示例,请查看 documentation

根据对所需列应用 frozenset 创建摘要。这里我们使用所有列。

summary = df.apply(frozenset, axis=1).value_counts()

这会给你 Series 的:

(A, B)    2
(C, B)    2
(B, D)    1
dtype: int64

然后您可以通过遍历该系列来重建 DataFrame,例如:

df2 = pd.DataFrame(((*idx, val) for idx, val in summary.items()), columns=[*df.columns, 'count'])

这导致:

  source target  count
0      A      B      2
1      C      B      2
2      B      D      1

以下方法创建一个新列,其中包含指定列中的一组值。优点是所有其他列都保留在最终结果中。此外,索引的保存方式与您发布的预期输出相同:

df = pd.DataFrame([['A','B'],['D','B'],['B','A'],['B','C'],['C','B']],
              columns=['source', 'target'],)

# Create column with set of both columns
df['tmp'] = df.apply(lambda x: frozenset([x['source'], x['target']]), axis=1)

# Create count column based on new tmp column
df['count'] = df.groupby(['tmp'])['target'].transform('size')

# Drop duplicate rows based on new tmp column
df = df[~df.duplicated(subset='tmp', keep='first')]

# Remove tmp column
df = df.drop('tmp', 1)

df

输出:

    source  target  count
0   A   B   2
1   D   B   1
3   B   C   2