查找 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
我正在尝试查找 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