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
相关产品推荐
相关产品推荐

