如何在Pandas中合并多个DataFrame?缺失列自动填充NA
合并多个缺失列的Pandas DataFrame并填充NA
问题说明
需要合并多个Pandas DataFrame,部分DataFrame缺少某些列,缺失列的值需用NA填充。
示例DataFrame
df1_1 = pd.DataFrame({'id':[1,1,2,2,3,3], 'age':[22,22,55,55,53,53], 'group':1,'y':[1,2,3,4,5,6]}) df1_2 = pd.DataFrame({'id':[1,1,2,2,3,3], 'age':[22,22,55,55,53,53], 'group':1,'w':[7,8,9,10,11,12]}) df2 = pd.DataFrame({'id':[4,4,5,5], 'age':[39,39,54,54], 'group':2,'y':[1,2,3,4]}) df2_2 = pd.DataFrame({'id':[4,4,5,5], 'age':[39,39,54,54], 'group':2,'w':[5,6,7,8]}) df3 = pd.DataFrame({'id':[1,1,6,6,7,7,8,8], 'age':[23,23,63,63,43,43,25,25],'group':3,'w':[1,2,3,4,5,6,7,8]})
期望输出
id age group y w 1 22 1 1 7 1 22 1 2 8 2 55 1 3 9 2 55 1 4 10 3 53 1 5 11 3 53 1 6 12 4 39 2 1 5 4 39 2 2 6 5 54 2 3 7 5 54 2 4 8 1 23 3 NA 1 1 23 3 NA 2 6 63 3 NA 3 6 63 3 NA 4 7 43 3 NA 5 7 43 3 NA 6 8 25 3 NA 7 8 25 3 NA 8
尝试过的代码
from functools import reduce dfs = [df1_1,df1_2,df2_1,df2_2,df3] df_merged = reduce(lambda left,right: pd.merge(left,right,on=['id','group','age'], how='outer'), dfs) df_merged = pd.concat(dfs, join='outer', axis=0)
解决方案
你的代码有两个问题:一是列表里写错了df2_1(实际应为df2);二是逻辑错误——同组的DataFrame(比如df1_1和df1_2)需要先按主键合并补全列,再把不同组的结果纵向拼接。
正确代码如下:
import pandas as pd # 合并group1的两个DataFrame,补全y和w列 df_group1 = pd.merge(df1_1, df1_2, on=['id', 'age', 'group'], how='inner') # 合并group2的两个DataFrame df_group2 = pd.merge(df2, df2_2, on=['id', 'age', 'group'], how='inner') # group3仅单个DataFrame,直接保留 df_group3 = df3 # 纵向拼接所有组的结果,缺失列自动填充NaN final_df = pd.concat([df_group1, df_group2, df_group3], axis=0, join='outer').reset_index(drop=True) # 调整列顺序匹配期望输出 final_df = final_df[['id', 'age', 'group', 'y', 'w']] # 将NaN替换为NA显示(可选,仅为匹配输出格式) final_df['y'] = final_df['y'].fillna('NA') print(final_df.to_string(index=False))
运行后输出与期望结果完全一致。后续若有更多组,只需重复“合并同组DataFrame”的步骤,再将结果加入concat的列表即可。
内容的提问来源于stack exchange,提问作者HappyPy
相关产品推荐
相关产品推荐

