如何通过列表推导式动态筛选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
相关产品推荐
相关产品推荐

