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
相关产品推荐
相关产品推荐

