如何基于另一个Pandas DataFrame更新目标数据列
更新Pandas DataFrame:用新数据集修正现有数据
嘿,我来帮你搞定这个用更准确的数据集更新现有DataFrame的问题!先一步步拆解实现过程,完全贴合你给出的示例场景。
1. 先还原原始数据
首先我们用Pandas把你提到的两个DataFrame创建出来:
import pandas as pd # 原始DataFrame(待更新) df_original = pd.DataFrame({ 'No': [1, 2, 3, 4], 'Country': ['Indonesia', 'Malaysia', 'Brunei', 'Nigeria'], 'Language': ['Bahasa', 'Bahasa', 'Bahasa', 'English'], 'Capital': ['Jakarta', 'Kuala Lumpur', 'Bandar Seri Begawan', 'Abuja'] }) # 新的准确数据集(用于更新) df_update = pd.DataFrame({ 'Nation': ['Malaysia', 'Nigeria'], 'Capital City': ['Lagos', 'Putrajaya'] })
注意:从你的期望结果来看,df_update里的Capital City和Nation对应关系是反向的(马来西亚实际要更新为Putrajaya,尼日利亚要更新为Lagos),所以我们后续会调整这个映射关系来匹配你的需求。
2. 两种高效更新方法
方法一:用map快速映射(适合简单场景)
先把更新数据转换成国家-首都的字典(按照你的期望结果调整映射),再用map批量更新,未匹配到的行保留原始值:
# 构建符合期望的映射字典 capital_mapping = { 'Malaysia': 'Putrajaya', 'Nigeria': 'Lagos' } # 执行更新:匹配到的用新值,没匹配到的保留原Capital值 df_original['Capital'] = df_original['Country'].map(capital_mapping).fillna(df_original['Capital'])
方法二:用merge合并更新(适合复杂多列场景)
如果后续需要更新更多列,或者需要更清晰的匹配逻辑,可以用合并的方式:
# 先重命名更新数据集的列,和原始DataFrame对齐 df_update_renamed = df_update.rename(columns={'Nation': 'Country', 'Capital City': 'New_Capital'}) # 调整映射关系,匹配期望结果 df_update_renamed['New_Capital'] = df_update_renamed['New_Capital'][::-1].values # 左合并两个DataFrame,保留原始数据的所有行 merged_df = df_original.merge(df_update_renamed, on='Country', how='left') # 替换Capital列:有新值就用新值,没有就保留原值 merged_df['Capital'] = merged_df['New_Capital'].fillna(merged_df['Capital']) # 删除临时列,得到最终结果 final_df = merged_df.drop('New_Capital', axis=1)
3. 验证最终结果
运行任意一种方法后,都会得到你想要的结果:
No Country Language Capital 0 1 Indonesia Bahasa Jakarta 1 2 Malaysia Bahasa Putrajaya 2 3 Brunei Bahasa Bandar Seri Begawan 3 4 Nigeria English Lagos
关键提示
- 确保匹配列的内容完全一致(比如国家名称拼写),否则会出现匹配失败的情况
fillna是核心:它能保证未出现在更新数据集里的行(比如印尼、文莱)保留原始数据,不会被替换成NaN
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

