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

Pandas如何按条件用其他DataFrame的ID替换当前表对应列值

Pandas文本维度值替换为对应ID的实现方案

原有代码失效原因

你之前的写法依赖Pandas默认的索引对齐规则:pd_company.loc[pd_company['name'].isin(pd_staff['company']), 'id']返回的是公司维度表自身索引对应的ID序列,和员工表筛选后行的索引不匹配,只有索引位置刚好重合的第一行能赋值成功,其余行全部因为索引对不上被赋值为NaN。

推荐实现方案

用字典映射的方式做替换逻辑最简洁、效率最高,不会出现索引对齐问题:

# 生成名称到ID的映射字典
company_map = dict(zip(pd_company["name"], pd_company["id"]))
division_map = dict(zip(pd_division["name"], pd_division["id"]))

# 批量替换列值
pd_staff["company"] = pd_staff["company"].map(company_map)
pd_staff["division"] = pd_staff["division"].map(division_map)

如果担心源数据存在维度表中没有的异常名称,可以把map替换为replace,匹配失败的值会保留原始文本,不会直接返回NaN,方便排查脏数据。

运行后即可得到期望结果:

id     name  company  division
0  P001     John        1         1
1  P002     Jane        2         2
2  P003      Joe        3         3
3  P004     Adam        2         4
4  P004  Barbara        1         5

可选关联写法

如果习惯用表关联的逻辑实现,也可以通过两次左连接完成替换,适合需要同时关联多个维度字段的场景:

# 关联公司维度
pd_staff = pd_staff.merge(
    pd_company.rename(columns={"id": "company_id", "name": "company"}),
    on="company",
    how="left"
).drop(columns="company").rename(columns={"company_id": "company"})

# 关联部门维度
pd_staff = pd_staff.merge(
    pd_division.rename(columns={"id": "division_id", "name": "division"}),
    on="division",
    how="left"
).drop(columns="division").rename(columns={"division_id": "division"})

该写法最终输出结果和字典映射方案完全一致,仅数据量较大时执行效率略低于字典映射。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:01:06