Pandas如何通过另一DataFrame按ID更新指定列,保持其他值不变
高效实现方案
以下两种方案均为pandas原生矢量化操作,底层由C实现,性能远高于自行编写的for循环,处理十万级、百万级数据也不会有性能瓶颈:
方法1:map映射法(推荐,性能最优)
仅需提取匹配所需的ID和Item字段生成映射关系,内存占用低,执行速度最快:
import pandas as pd # 构造示例DataFrame,实际使用时可以跳过这步,用自己已有的df即可 applesdf = pd.DataFrame({ 'ID': [1], 'Item': ['Apple'], 'Price': [2], 'Location':[1001] }) applesaucedf = pd.DataFrame({ 'ID': [1], 'Item': ['Applesauce'], 'Price': [3], 'Location':[1002] }) # 生成ID到对应Item的映射序列 id_to_item = applesaucedf.set_index('ID')['Item'] # 替换applesdf的Item列,ID匹配不到的会保留原有值 applesdf['Item'] = applesdf['ID'].map(id_to_item).fillna(applesdf['Item'])
方法2:merge关联法
适合后续需要扩展匹配多列的场景,逻辑更直观:
# 仅取匹配需要的列做左关联,避免覆盖applesdf的其他字段 applesdf = applesdf.merge( applesaucedf[['ID', 'Item']], on='ID', how='left', suffixes=('_old', '') ) # 匹配成功的用新Item值,不成功的保留原值 applesdf['Item'] = applesdf['Item'].fillna(applesdf['Item_old']) # 删除冗余的旧Item列 applesdf = applesdf.drop('Item_old', axis=1)
运行两种方法后输出的applesdf都符合预期结果:
| ID | Item | Price | Location |
|---|---|---|---|
| 1 | Applesauce | 2 | 1001 |
官方文档查阅说明
你可以直接在pandas官方文档检索以下内容查阅相关用法:
pandas.Series.map函数的参数说明与使用示例pandas.DataFrame.merge函数的关联规则说明- 文档板块「Merge, join, concatenate and compare」下的多表关联操作指南
内容的提问来源于stack exchange,提问作者i.d.s.chicago
相关产品推荐
相关产品推荐

