基于ID合并DataFrame,用标准名称替换目标DataFrame对应名称
Pandas 按ID批量替换名称并提取被替换项
需求说明
有两个包含id和name字段的DataFrame,其中df1数据量大于df2。需要基于id字段关联,用df2里的标准品牌名称替换df1中对应id的名称,同时找出df1里所有被替换过的原始名称。
示例数据
原始df1
import pandas as pd df1 = pd.DataFrame({ 'id': [123, 124, 125, 126], 'name': ['Del Monte', 'Pokmon', 'Pokmon', 'Pokmon'] }, index=[0, 154047, 171696, 69264])
输出展示:
index id name 0 123 Del Monte 154047 124 Pokmon 171696 125 Pokmon 69264 126 Pokmon
原始df2(标准名称表)
df2 = pd.DataFrame({ 'id': [124, 125], 'name': ['Pokémon', 'Pokémon'] }, index=[79376, 135487])
输出展示:
index name id 79376 Pokémon 124 135487 Pokémon 125
处理步骤与代码
- 构建id到标准名称的映射字典
把df2转换成以id为键、name为值的字典,方便快速匹配替换:
name_mapping = df2.set_index('id')['name'].to_dict()
- 保存原始名称(用于后续提取被替换项)
在df1里新增一列original_name,先把原来的name值存起来:
df1['original_name'] = df1['name']
- 批量替换名称
用map方法匹配id对应的标准名称,没有匹配到的id(比如示例里的123、126)保留原名称:
df1['name'] = df1['id'].map(name_mapping).fillna(df1['name'])
- 提取所有被替换的原始名称
筛选出原始名称和替换后名称不一致的行,提取其中的原始名称并去重:
replaced_names = df1[df1['original_name'] != df1['name']]['original_name'].unique()
最终结果
替换后的df1
index id name original_name 0 123 Del Monte Del Monte 154047 124 Pokémon Pokmon 171696 125 Pokémon Pokmon 69264 126 Pokmon Pokmon
如果不需要保留original_name列,直接用df1.drop('original_name', axis=1)删除即可。
被替换的原始名称
print(replaced_names) # 输出:['Pokmon']
内容的提问来源于stack exchange,提问作者Protonios
相关产品推荐
相关产品推荐

