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

如何通过列表推导式动态筛选DataFrame子集并生成正确多条件过滤逻辑

实现方案

问题原因说明

  • 第一个KeyError报错是因为你直接把过滤表达式字符串传入了df[]索引器,它会把整个字符串当做列名去查找,自然找不到对应列。执行字符串格式的过滤表达式需要用pandas的query()方法。
  • 你原来的列表推导式是两层循环扁平化拼接所有条件,所以所有条件都用|连接,没有做组内&拼接、组外套括号的处理,不符合规则要求。

具体实现代码

首先导入依赖、构造原始DataFrame:

import pandas as pd

# 原始数据转DataFrame
cars = {'brand': ['Honda','Honda','Honda','Toyota','Toyota','Audi'],
        'model': ['a','b','c','d','a','b'],
       }
df = pd.DataFrame(cars)

# 关联规则字典
relation = {
    'relation1':[
        {'brand':'Honda','model':'a'},
        {'brand':'Honda','model':'b'},
        {'brand':'Toyota','model':'d'}
    ],
    'relation2':[
        {'brand':'...','model':'...'},
        {'brand':'...','model':'...'}
    ]
}

生成符合要求的过滤表达式:

# 按规则拼接表达式
condition_list = []
for rule_group in relation['relation1']:
    # 单组内多个条件用&连接,外面套括号
    single_group = ' & '.join([f"{k}=={repr(v)}" for k, v in rule_group.items()])
    condition_list.append(f"({single_group})")
# 不同组之间用|连接
full_condition = ' | '.join(condition_list)

打印full_condition即可得到你需要的格式:

(brand=='Honda' & model=='a') | (brand=='Honda' & model=='b') | (brand=='Toyota' & model=='d')

最后用query方法过滤得到结果:

filtered_df = df.query(full_condition)
# 转成你要的字典格式结果
result = filtered_df.to_dict('list')
print(result)

输出为预期结果:

{'brand': ['Honda', 'Honda', 'Toyota'], 'model': ['a', 'b', 'd']}

如果你偏好更简洁的写法,也可以用一行列表推导式直接生成完整表达式:

full_condition = ' | '.join([f"({' & '.join(f'{k}=={repr(v)}' for k,v in g.items())})" for g in relation['relation1']])

内容的提问来源于stack exchange,提问作者HedgeHog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:45:07