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

如何基于嵌套字典条件在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:27:01