如何用另一数据集替换某列指定值且保留原数据集其他值?
Pandas 用匹配数据集替换指定列值的解决方案
原始数据集
df1 代码及输出
import pandas as pd df1 = pd.DataFrame() df1['number'] = [0,0,0,0,0] df1["decade"] = ["1970", "1980", "1990", "2000", "2010"] print(df1)
输出:
number decade 0 0 1970 1 0 1980 2 0 1990 3 0 2000 4 0 2010
df2 代码及输出
df2 = pd.DataFrame() df2['number'] = [1,1] df2["decade"] = ["1990", "2010"] print(df2)
输出:
number decade 0 1 1990 1 1 2010
需求
用df2中与decade匹配的number值,替换df1对应行的number,保留df1未匹配行的原始值,最终结果如下:
number decade 0 0 1970 1 0 1980 2 1 1990 3 0 2000 4 1 2010
实现方案
以下是三种高效可行的方法:
方法1:使用update()直接修改原数据集
update()会基于索引匹配,将df2的对应值覆盖到df1上:
# 将两个数据集的索引设置为decade,确保匹配逻辑正确 df2.set_index('decade', inplace=True) df1.set_index('decade', inplace=True) # 执行替换 df1.update(df2) # 恢复原索引结构 df1.reset_index(inplace=True) print(df1)
方法2:使用combine_first()生成新数据集
该方法优先取df2的有效值,无匹配时保留df1的原始值,适合不想修改原数据的场景:
# 分别设置索引为decade df1_idx = df1.set_index('decade') df2_idx = df2.set_index('decade') # 合并并恢复索引 result = df2_idx.combine_first(df1_idx).reset_index() print(result)
方法3:字典映射替换(灵活通用)
先将df2转换为decade: number的字典,再通过map()完成替换,未匹配值用fillna()保留原值:
# 构建decade到number的映射字典 decade_number_map = df2.set_index('decade')['number'].to_dict() # 替换df1的number列,未匹配项保留原始值 df1['number'] = df1['decade'].map(decade_number_map).fillna(df1['number']).astype(int) print(df1)
内容的提问来源于stack exchange,提问作者BoyAcc
相关产品推荐
相关产品推荐

