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



我正试图找到两列之间的重复项,因为顺序是独立的,但我需要在删除它们后保留重复项的计数

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 = 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

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

基于对所需列应用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

最新更新