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