You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas如何去除逆序重复项?含示例与已尝试方案

如何去除DataFrame中逆序重复的组合(如banana-apple与apple-banana)?

问题背景

假设我们有如下DataFrame:

import pandas as pd

df = pd.DataFrame(
    {"col1": ["banana", "apple", "grapes", "banana"], 
     "col2": ["apple", "banana", "apple", "grapes"]}
)

对应的数据如下:

col1    col2
0  banana   apple
1   apple  banana
2  grapes   apple
3  banana  grapes

我们需要去除像banana-apple和apple-banana这类逆序重复的组合,只保留其中一行。你已经尝试过通过将每行转为set再转字符串的方式生成校验列,然后去重,这里提供几种其他可行方案:


方案1:排序后拼接成统一格式的字符串

核心思路是让每个逆序组合生成完全相同的标识:对每行的两个列值进行排序,再用分隔符拼接成字符串,这样不管原始顺序如何,相同元素的组合都会得到一致的键。

# 生成排序后的拼接键
df["sorted_pair"] = df.apply(lambda x: '-'.join(sorted([x["col1"], x["col2"]])), axis=1)
# 保留每个唯一键的第一行(也可以选keep="last"保留最后一行)
df_unique = df.drop_duplicates(subset="sorted_pair", keep="first")

# 查看结果
print(df_unique)

输出结果:

col1    col2    sorted_pair
0  banana   apple  apple-banana
2  grapes   apple  apple-grapes
3  banana  grapes  banana-grapes

这个方案的优点是生成的键可读性强,便于调试,适合小到中等规模的数据集。


方案2:用Numpy实现向量化排序(适合大数据集)

如果你的数据集很大,apply的循环操作效率会比较低。可以用Numpy的向量化排序来提升性能,避免逐行处理:

import numpy as np

# 将两列转为Numpy数组,按行排序
sorted_values = np.sort(df[["col1", "col2"]].values, axis=1)
# 将排序后的结果存入临时列
df[["sorted_col1", "sorted_col2"]] = sorted_values
# 根据临时列去重
df_unique = df.drop_duplicates(subset=["sorted_col1", "sorted_col2"], keep="first")
# 清理临时列(可选)
df_unique = df_unique.drop(columns=["sorted_col1", "sorted_col2"])

print(df_unique)

Numpy的向量化操作比Pandas的apply快得多,数据量越大,性能优势越明显。


方案3:使用frozenset作为唯一标识(避免字符串转换问题)

你之前用set转字符串的方式可能存在潜在问题(比如不同环境下set的字符串表示可能有差异),而frozenset是可哈希的类型,可以直接作为去重的依据,不需要转换为字符串:

# 生成可哈希的frozenset列
df["frozen_pair"] = df.apply(lambda x: frozenset([x["col1"], x["col2"]]), axis=1)
# 根据frozenset去重
df_unique = df.drop_duplicates(subset="frozen_pair", keep="first")

print(df_unique)

这个方案比字符串转换更可靠,因为frozenset直接以元素集合作为判断依据,不会受字符串格式的影响。


内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:22