Python Pandas 基于另一DataFrame的多条件匹配筛选主表数据
问题分析
原有实现存在以下核心问题:
- 时间复杂度过高:使用
itertools.combinations遍历所有日期两两组合,数据量稍大就会出现O(n²)级的计算开销,是内存溢出的核心诱因 - 分组逻辑错误:仅按
Numero分组,未按要求同时按Date分组,完全不满足「同一Numero、同一Date」的校验规则 - 结果匹配错误:最终仅通过
Numero过滤主表,会返回对应Numero下所有行,无法精准保留符合条件的特定(Numero, Date)分组下的行 - 冗余计算多:逐行遍历
cond、重复调用str.contains,没有做任何预优化
高效实现方案
直接按需求双字段分组校验,代码如下:
import pandas as pd # 预提取所有条件对,避免重复读取cond cond_pairs = list(cond[['Info 1', 'Info 2']].itertuples(index=False, name=None)) # 分组校验函数:判断当前(Numero, Date)分组是否满足任意一组条件 def check_group(group): loc_series = group['location'] for info1, info2 in cond_pairs: # regex=False关闭正则解析,避免特殊字符报错同时提升匹配速度 if loc_series.str.contains(info1, regex=False).any() \ and loc_series.str.contains(info2, regex=False).any(): return True return False # 直接过滤得到符合要求的所有行 result = y.groupby(['Numero', 'Date'], as_index=False, group_keys=False).filter(check_group)
额外优化提示
如果业务中location是精确匹配而非子串包含,可将匹配逻辑替换为集合判断,速度会提升1~2个数量级:
def check_group(group): loc_set = set(group['location']) for info1, info2 in cond_pairs: if info1 in loc_set and info2 in loc_set: return True return False
内容的提问来源于stack exchange,提问作者user17037971
相关产品推荐
相关产品推荐

