Pandas中如何查找含通配符字符串值的重复行
查找含通配值"all"的DataFrame重复行高效方案
需求背景
需要实现一种高效的pandas DataFrame重复行识别逻辑:当某列取值为字符串all时,该值可代表对应列中出现过的所有非all取值,只要两条记录在同一ID分组下、所有字段满足精确匹配或all通配匹配,即判定为重复行。
测试样例
构造测试DataFrame如下:
import pandas as pd df = pd.DataFrame( { "ID": ["one", "two", "two", "two", "one"], "condition1": ["all", "red", "all", "red", "red"], "condition2": ["yellow", "black", "black", "orange", "black"], } )
样例预期判定结果:
- ID为
two的分组存在重复:记录[two, red, black]与[two, all, black]满足匹配规则,condition1列的all可覆盖red取值,两记录condition2取值一致- ID为
one的分组无重复:两条记录condition2列取值分别为yellow和black,无法通过all通配覆盖,不构成重复
现有实现及问题
当前已实现的方案逻辑为:将所有all取值替换为对应列非all值的集合,对条件列做逐列explode展开后调用duplicated()方法识别重复,代码如下:
df.loc[df.condition1=='all','condition1'] = set(df.condition1)-{'all'} df.loc[df.condition2=='all','condition2'] = set(df.condition2)-{'all'} df = df.explode('condition1') df = df.explode('condition2') df.duplicated()
该方案存在明显性能缺陷:当条件列的非all取值基数较高、含all的记录占比大时,explode操作会生成体量远超原表的中间DataFrame,内存占用高、运行速度慢,无法适配大规模数据场景。
待探索的优化方向
- 基于
groupby聚合实现匹配逻辑,原生支持all作为全量取值的匹配规则,避免生成大体积中间表 - 按ID拆分后逐组迭代检查:该方案目前可满足常规使用需求,但仍希望找到更规范、性能更优的实现方式
内容的提问来源于stack exchange,提问作者Ziur Olpa
相关产品推荐
相关产品推荐

