如何移除Pandas DataFrame中xy与yx等价的重复行?
解决Pandas自连接后重复等价组合行的问题
你遇到的是自连接后常见的重复组合问题——(name_x, name_y)和(name_y, name_x)属于同一逻辑组合,却生成了两行重复数据。这里有两种实用解法:
方法一:生成排序标识后去重(通用场景)
先给每一行生成一个排序后的name组合标识,再基于这个标识去重,就能保留唯一组合:
# 假设你的自连接+过滤后的DataFrame名为df_joined # 创建临时列,存储排序后的name元组 df_joined['sorted_pair'] = df_joined.apply(lambda r: tuple(sorted([r['name_x'], r['name_y']])), axis=1) # 按临时列去重,保留第一行 df_unique = df_joined.drop_duplicates(subset='sorted_pair', keep='first') # 移除临时列 df_unique = df_unique.drop(columns='sorted_pair')
方法二:连接时直接过滤(更高效)
从源头避免生成重复行——在自连接后直接添加name_x < name_y的条件(替代原来的name_x != name_y),这样只会生成单向的唯一组合:
# 假设原始DataFrame名为df # 自连接+一步过滤掉反向组合 df_unique = df.merge(df, on='class', suffixes=('_x', '_y')).query('name_x < name_y')
这种方法效率更高,尤其适合数据量较大的场景,不用先生成所有组合再去重。
注意:如果
name列是无法直接比较大小的类型(比如复杂对象),优先用方法一;如果是字符串、数字等可比较类型,方法二更推荐。
内容的提问来源于stack exchange,提问作者Filipe Abrao
相关产品推荐
相关产品推荐

