如何在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"]))
处理结果验证
以上述示例数据为例,处理后目标表输出如下:
| name | info1 | info2 |
|---|---|---|
| 张三 | 1 | a |
| 王老五 | 3 | c |
| 赵小六 | 4 | d |
| 张三 | 5 | e |
| 孙七 | 7 | g |
完全符合预设处理规则。
内容的提问来源于stack exchange,提问作者user16286965
相关产品推荐
相关产品推荐

