如何基于嵌套字典条件在Pandas DataFrame中新建并填充effect列
实现方案
我们可以通过统一规则字典的结构,动态生成布尔匹配条件实现需求,所有规则完全存放在字典中,无需硬编码逻辑,后续规则调整只需修改字典即可。
首先先约定规则字典cond_dict的统一结构(你原有的字典可按需调整为该结构,扩展性更强):
外层key为匹配成功后要赋值的effect值
内层每个键值对对应一个子匹配条件:
- 子条件key为DataFrame对应的列名
- 子条件value为要匹配的值,若为元组则表示满足任意一个值即可(OR逻辑)
同一个effect对应的所有子条件为AND逻辑,需要全部满足才算匹配成功
完整实现代码
import pandas as pd import numpy as np # 你的初始DataFrame df = pd.DataFrame( { 'ID': ['AB01', 'AB02', 'AB03', 'AB04', 'AB05','AB06'], 'drugNo': ["Osel","Placebo","Not Osel",np.nan,"UKN","Osel"], 'drugName': ['Placebo', 'Vitamin C', np.nan, 'Placebo', '', 'Type X'] }) # 调整结构后的规则字典,可按需扩展修改 cond_dict = { 'Anti': {'drugNo': ('Osel', 'Not Osel')}, 'Placebo Effect': {'drugNo': 'Placebo', 'drugName': 'Vitamin C'}, 'UNKNOWN': {'drugNo': 'UKN'} } # 初始化effect列为空值 df['effect'] = np.nan # 遍历规则逐类匹配(字典键的顺序即为规则优先级,先匹配的不会被后序规则覆盖) for effect_val, conds in cond_dict.items(): # 初始化当前规则的匹配掩码为全True match_mask = pd.Series(True, index=df.index) for col, match_target in conds.items(): if isinstance(match_target, tuple): # 元组对应OR逻辑,匹配任意值即可 sub_mask = df[col].isin(match_target) else: # 单值对应精确匹配 sub_mask = df[col] == match_target # 多个子条件为AND逻辑,叠加掩码 match_mask &= sub_mask # 仅给还未匹配到值的行赋值 df.loc[match_mask & df['effect'].isna(), 'effect'] = effect_val # 验证输出结果 print(df['effect'].tolist())
运行后输出结果和你的预期完全一致:
['Anti', 'Placebo Effect', 'Anti', nan, 'UNKNOWN', 'Anti']
规则扩展说明
后续要新增规则不需要修改业务代码,只需要按约定结构修改cond_dict即可:
- 需要多值OR匹配就把匹配值写成元组
- 需要多字段AND匹配就增加对应列的子条件
- 调整字典键的顺序即可修改规则优先级
内容的提问来源于stack exchange,提问作者Zakyl
相关产品推荐
相关产品推荐

