基于'serial no'列(忽略项顺序)去重的Pandas实现
Pandas实现忽略逗号分隔顺序的去重(基于serial no列)
问题背景
通过PostgreSQL的unnest函数导出的数据集存在大量重复记录,核心问题是serial no列中逗号分隔的项顺序不同(比如"A,B"和"B,A")被视为不同值,但实际属于同一组合,需要基于此规则去重,保留有效数据组合。
解决方案思路
核心是给serial no列生成一个标准化标识:将逗号分隔的字符串拆分、按固定顺序排序后重新拼接,这样不同顺序的同一组值会得到完全相同的标识。随后结合memberid、标准化标识、Serial列来判断重复项,最终去重并统一serial no的显示格式。
完整代码示例
import pandas as pd # 模拟输入数据(实际场景可替换为从文件/数据库读取的数据集) data = { "memberid": [1, 1, 1, 1], "serial no": ["A,B", "B,A", "A,B", "B,A"], "Serial": ["A", "B", "B", "A"] } df = pd.DataFrame(data) # 生成标准化的serial no键:拆分、排序后重新拼接 df["standard_serial"] = df["serial no"].apply(lambda s: ",".join(sorted(s.split(",")))) # 基于memberid、标准化标识、Serial列去重,保留每组第一条记录 df_dedup = df.drop_duplicates(subset=["memberid", "standard_serial", "Serial"], keep="first") # 统一serial no为标准化值,删除临时辅助列 df_dedup = df_dedup.assign(**{"serial no": df_dedup["standard_serial"]}).drop("standard_serial", axis=1) # 重置索引(可选操作) df_dedup = df_dedup.reset_index(drop=True) print(df_dedup)
代码说明
- 标准化处理:通过lambda函数快速实现字符串拆分、排序、拼接,确保"A,B"和"B,A"这类顺序不同的相同组合生成一致的标识。
- 去重逻辑:
drop_duplicates指定三个核心列作为去重依据,精准过滤掉顺序不同但实质重复的记录。 - 格式统一:最后将
serial no替换为标准化后的值,保证输出格式的一致性,同时清理临时辅助列。
输出结果
运行代码后得到的结果与示例要求一致:
| memberid | serial no | Serial |
|---|---|---|
| 1 | A,B | A |
| 1 | A,B | B |
内容的提问来源于stack exchange,提问作者Priti Jorvekar
相关产品推荐
相关产品推荐

