如何合并两个Pandas DataFrame并填充缺失值(附示例)
合并Pandas DataFrame并填充缺失值的解决方案
问题场景
现有两个DataFrame:
input1:包含完整字段数据input2:存在缺失值的数据集
需按以下规则合并并填充缺失值,得到目标output:
- input1第1行通过Age列匹配input2第1行,填充Name列;
- input1第2行匹配input2第2行,填充Name和Age列;
- input1第1行匹配input2第2行,填充Name和Age列。
示例数据
import pandas as pd import numpy as np # 完整数据集input1 input1 = pd.DataFrame({ 'Name': ['Tom', 'Nick'], 'Age': [20, 21], 'Courses': ['Math', 'Science'] }) # 带缺失值的input2 input2 = pd.DataFrame({ 'Name': [np.NaN, np.NaN], 'Age': [20, np.NaN], 'Fees': [100, 200] }) # 目标输出结果 target_output = pd.DataFrame({ 'Name': ['Tom', 'Nick', 'Tom'], 'Age': [20, 21, 20], 'Courses': ['Math', 'Science', 'Math'], 'Fees': [100, 200, 200] })
解决方案代码
# 拆分input2为Age非空和Age为空的两组 input2_non_null_age = input2[input2['Age'].notna()] input2_null_age = input2[input2['Age'].isna()] # 处理Age非空行:按Age精确匹配合并 merge_non_null = pd.merge(input1, input2_non_null_age, on='Age', how='inner') merge_non_null = merge_non_null.rename(columns={'Name_x': 'Name'}).drop(columns=['Name_y']) # 处理Age空值行:与input1做笛卡尔积(匹配所有行) merge_null = pd.merge(input1, input2_null_age, how='cross') merge_null = merge_null.rename(columns={'Name_x': 'Name', 'Age_x': 'Age'}).drop(columns=['Name_y', 'Age_y']) # 合并两部分结果并重置索引 output = pd.concat([merge_non_null, merge_null], ignore_index=True) # 验证结果是否符合目标 print(output.equals(target_output)) # 输出True
代码说明
- 拆分数据集:根据input2中Age列是否为空拆分,适配两种不同匹配逻辑;
- Age非空行处理:通过
merge按Age精确匹配,保留input1的有效Name字段,丢弃input2的缺失值; - Age空值行处理:用
crossjoin生成input1与input2空Age行的所有组合,直接用input1的Name和Age填充缺失值; - 合并结果:拼接两部分处理后的数据集,得到最终目标DataFrame。
内容的提问来源于stack exchange,提问作者l a s
相关产品推荐
相关产品推荐

