You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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

代码说明

  1. 拆分数据集:根据input2中Age列是否为空拆分,适配两种不同匹配逻辑;
  2. Age非空行处理:通过merge按Age精确匹配,保留input1的有效Name字段,丢弃input2的缺失值;
  3. Age空值行处理:用cross join生成input1与input2空Age行的所有组合,直接用input1的Name和Age填充缺失值;
  4. 合并结果:拼接两部分处理后的数据集,得到最终目标DataFrame。

内容的提问来源于stack exchange,提问作者l a s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:45:06