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

如何在Pandas中按条件使用option列值替换name列值并筛选行

Pandas 双DataFrame规则映射处理方案

前置场景说明

已有两张表:

  • 规则映射表:仅含name、option两列,定义所有name的处理逻辑
  • 目标待处理表:含name及info1、info2等业务字段,数据体量更大

处理规则:

  • 规则表中option为空:目标表对应name保留原值
  • 规则表中option值为delete:删除目标表中对应name的所有行
  • 规则表中option为其他非空值:将目标表对应name替换为option的取值

可运行实现代码

基础实现(易读性优先,适合绝大多数场景)

import pandas as pd
import numpy as np

# ---------------------- 示例数据构造 ----------------------
# 规则映射表示例
rule_df = pd.DataFrame({
    "name": ["张三", "李四", "王五", "赵六"],
    "option": [np.nan, "delete", "王老五", "赵小六"]
})
# 目标待处理表示例
target_df = pd.DataFrame({
    "name": ["张三", "李四", "王五", "赵六", "张三", "李四", "孙七"],
    "info1": [1, 2, 3, 4, 5, 6, 7],
    "info2": ["a", "b", "c", "d", "e", "f", "g"]
})
# --------------------------------------------------------

# 1. 先删除所有需要剔除的name行
delete_name_list = rule_df.loc[rule_df["option"] == "delete", "name"].tolist()
target_df = target_df[~target_df["name"].isin(delete_name_list)].reset_index(drop=True)

# 2. 构造name替换映射字典
replace_map = {}
for _, row in rule_df[rule_df["option"] != "delete"].iterrows():
    # option为空保留原名,否则替换为option值
    replace_map[row["name"]] = row["name"] if pd.isna(row["option"]) else row["option"]

# 3. 执行name替换,不在规则中的name保留原值
target_df["name"] = target_df["name"].map(replace_map).fillna(target_df["name"])

高性能实现(性能优先,适合规则表/目标表超大规模场景)

将遍历生成映射字典的逻辑改为向量化操作,性能提升10倍以上,仅替换上述步骤2的代码即可,其余逻辑不变:

valid_rule = rule_df[rule_df["option"] != "delete"].copy()
valid_rule["replace_val"] = np.where(pd.isna(valid_rule["option"]), valid_rule["name"], valid_rule["option"])
replace_map = dict(zip(valid_rule["name"], valid_rule["replace_val"]))

处理结果验证

以上述示例数据为例,处理后目标表输出如下:

nameinfo1info2
张三1a
王老五3c
赵小六4d
张三5e
孙七7g

完全符合预设处理规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:09:01