如何使用Pandas根据另一DataFrame匹配结果更新目标DataFrame列值
Pandas 关联填充DataFrame指定列实现方案
核心实现代码
直接通过ID映射的方式完成填充,不会改动原表行顺序、其他列内容,无匹配ID的行自动保留原有空值,完全匹配需求:
# 构建 channels 表ID到官网地址的键值映射 id_to_website = channels.set_index("ID")["Website"].to_dict() # 按Channel_id匹配填充website列 videos["website"] = videos["Channel_id"].map(id_to_website)
效果验证
你可以用下方代码直接构造样例数据运行测试:
import pandas as pd # 构造样例channels表 channels = pd.DataFrame({ "Channel": ["Company A", "Company B", "Company C", "Company D"], "ID": ["A0001", "A0002", "A0003", "A0004"], "Website": ["a.com", "b.com", "c.com", "d.com"] }) # 构造样例videos表 videos = pd.DataFrame({ "Category": ["Comedy", "Action", "Horror", "Comedy", "Comedy", "Comedy"], "Channel_id": ["A0003", "A0004", "A0008", "A0001", "A0044", "A0002"], "Channel_name": ["AAA", "BBB", "CCC", "DDD", "EEE", "FFF"], "website": pd.NA }) # 执行填充 id_to_website = channels.set_index("ID")["Website"].to_dict() videos["website"] = videos["Channel_id"].map(id_to_website)
运行后输出的videos表和期望结果完全一致:
| Category | Channel_id | Channel_name | website |
|---|---|---|---|
| Comedy | A0003 | AAA | c.com |
| Action | A0004 | BBB | d.com |
| Horror | A0008 | CCC | |
| Comedy | A0001 | DDD | a.com |
| Comedy | A0044 | EEE | |
| Comedy | A0002 | FFF | b.com |
特殊场景适配
如果你的videos表website列本身已经存在部分非空值,只需要填充匹配到ID的空行、不覆盖原有内容,可以把填充代码替换为:
videos["website"] = videos["website"].fillna(videos["Channel_id"].map(id_to_website))
说明:这个场景不推荐用
pd.merge实现,merge后需要额外清理重复列、校验行顺序,代码冗余度高,单字段映射填充的场景下用map是效率最高、代码最简洁的方案。
内容的提问来源于stack exchange,提问作者MarkWP
相关产品推荐
相关产品推荐

