Pandas如何匹配两个DataFrame指定列值并替换对应列内容
Pandas 按SICCode匹配替换DF2字段值方案
你之前用.map/.isin/if-else没成功,核心原因是没提前处理DF1里同一个SICCode对应多个Industry Title的重复问题——你给出的样例里SICCode=4941在DF1同时对应两个行业名,不先做去重映射的话,匹配时会出现值冲突、返回空值的问题。
可直接运行的实现代码
- 先构造去重的映射字典,每个SICCode只保留第一次出现对应的行业名,避免多值冲突
# 去重逻辑:同一SICCode取DF1中第一条记录的Industry Title作为映射值 sic_map = DF1.drop_duplicates(subset="SICCode", keep="first")\ .set_index("SICCode")["Industry Title"]\ .to_dict()
- 批量替换DF2的Sector列,匹配不到的SICCode保留原有Sector值
DF2["Sector"] = DF2["SICCode"].map(sic_map).fillna(DF2["Sector"])
替换后结果
针对你给出的样例数据,替换后的DF2如下,完全符合需求:
| SICCode | Sector |
|---|---|
| 4941 | AGRICULTURAL PRODUCTION-CROPS |
| 7374 | AGRICULTURAL PROD-LIVESTOCK & ANIMAL SPECIALTIES |
| 5065 | AGRICULTURAL SERVICES |
| 4941 | AGRICULTURAL PRODUCTION-CROPS |
| 5122 | FISHING, HUNTING AND TRAPPING |
之前方法失效的常见原因
- 用
.map时没有先对DF1的SICCode去重,同一编码对应多个行业名时,映射关系混乱导致返回空值 - 用
.isin只能判断值是否存在,无法关联拿到对应的Industry Title值,没法完成替换 - 手写if-else逐行遍历效率低,且大多没处理重复编码的映射优先级,容易出现值覆盖错误
内容的提问来源于stack exchange,提问作者risky2109
相关产品推荐
相关产品推荐

