如何基于name列用df2的行替换df1中对应行的数据?
基于Name列用df2补全df1缺失数据的实现方法
问题场景
现有两个DataFrame:
df1存在部分行的缺失值:
name code country type --------------------------------- ben 100 de l mic 200 nl s dan NaN NaN NaN bro NaN NaN NaN
df2包含df1缺失行的正确数据:
name code country type --------------------------------- dan 400 be l bro 500 cz m
需要基于name列,用df2的行替换df1中对应name的缺失行,得到目标DataFrame:
name code country type --------------------------------- ben 100 de l mic 200 nl s dan 400 be l bro 500 cz m
解决方案
以下是几种常用的Pandas实现方法:
方法1:使用combine_first()
该方法会优先保留df1的非缺失数据,仅用df2的数据填补df1的缺失项,需先将name设为索引以实现匹配:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'name': ['ben', 'mic', 'dan', 'bro'], 'code': [100, 200, pd.NA, pd.NA], 'country': ['de', 'nl', pd.NA, pd.NA], 'type': ['l', 's', pd.NA, pd.NA] }) df2 = pd.DataFrame({ 'name': ['dan', 'bro'], 'code': [400, 500], 'country': ['be', 'cz'], 'type': ['l', 'm'] }) # 设置name为索引,合并后重置索引并恢复列顺序 df_final = df1.set_index('name').combine_first(df2.set_index('name')).reset_index() df_final = df_final[['name', 'code', 'country', 'type']]
方法2:使用update()
该方法会直接用df2的数据覆盖df1中匹配到的行,注意会修改原DataFrame,建议先复制一份:
df1_copy = df1.copy() # 设置name为索引以对齐数据 df1_copy.set_index('name', inplace=True) df2.set_index('name', inplace=True) # 执行更新操作 df1_copy.update(df2) # 重置索引并恢复列顺序 df_final = df1_copy.reset_index()[['name', 'code', 'country', 'type']]
方法3:合并后去重(concat + drop_duplicates)
将两个DataFrame合并后,按name去重并保留最后出现的行(即df2的行),适合df2完全覆盖df1缺失行的场景:
# 合并两个DataFrame combined_df = pd.concat([df1, df2]) # 按name去重,保留最后一行,再排序恢复原顺序 df_final = combined_df.drop_duplicates(subset='name', keep='last') \ .sort_values('name') \ .reset_index(drop=True) df_final = df_final[['name', 'code', 'country', 'type']]
内容的提问来源于stack exchange,提问作者Denver Dang
相关产品推荐
相关产品推荐

