合并列名基本相同但唯一ID不同的Pandas DataFrame
解决方法
可以通过Pandas的全外连接、列合并和缺失值填充来实现需求,具体步骤如下:
1. 导入依赖并创建示例数据
import pandas as pd # 构建示例df1 df1 = pd.DataFrame({ 'ID': [1, 3, 4, 5, 8], 'a': ['...', '.', '.', '', ''], 'b': ['', '', '', '', ''], 'c': ['', '', '', '', ''], 'd': ['', '', '', '', ''], 'pred_1': [0, 1, 1, 0, 0] }) # 构建示例df2 df2 = pd.DataFrame({ 'ID': [2, 3, 6, 5, 7, 9], 'a': ['...', '.', '.', '', '', ''], 'b': ['', '', '', '', '', ''], 'c': ['', '', '', '', '', ''], 'd': ['', '', '', '', '', ''], 'pred_2': [1, 1, 0, 0, 1, 1] })
2. 全外连接两个DataFrame
以ID为键做全外连接,保留所有ID,同时会生成重复的特征列(如a_x、a_y):
merged_df = pd.merge(df1, df2, on='ID', how='outer')
3. 合并重复的特征列
对a、b、c、d这些重复列,用combine_first合并(优先取df1的值,df1为空时取df2的值),并删除临时列:
for col in ['a', 'b', 'c', 'd']: merged_df[col] = merged_df[f'{col}_x'].combine_first(merged_df[f'{col}_y']) merged_df.drop([f'{col}_x', f'{col}_y'], axis=1, inplace=True)
4. 填充预测列的缺失值为0
将pred_1和pred_2中的缺失值(NaN)填充为0,并转为整数类型:
merged_df['pred_1'] = merged_df['pred_1'].fillna(0).astype(int) merged_df['pred_2'] = merged_df['pred_2'].fillna(0).astype(int)
5. 整理列顺序并排序
按照需求的列顺序重新排列,并按ID升序排序:
df3 = merged_df[['ID', 'a', 'b', 'c', 'd', 'pred_1', 'pred_2']].sort_values('ID').reset_index(drop=True)
执行后得到的df3就是你需要的结果:
ID a b c d pred_1 pred_2 0 1 ... 0 0 1 2 ... 0 1 2 3 . 1 1 3 4 . 1 0 4 5 0 0 5 6 . 0 0 6 7 0 1 7 8 0 0 8 9 0 1
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

