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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:18:02