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

Pandas如何按公共date列合并两个DataFrame并处理缺失值

问题描述

现有两个共享公共列 date 的 pandas DataFrame 对象:

  • df1 的 date 列无任何缺失值,样例数据如下:
import pandas as pd
import numpy as np

df1 = pd.DataFrame({
    'date': ["2021-06-01 08:00:00", "2021-06-01 08:01:00", "2021-06-01 08:02:00", "2021-06-01 08:03:00", "2021-06-01 08:04:00"],
    'x1': [1, 2, 3, 4, 5]
})
print(df1)

输出结果:

date  x1
0  2021-06-01 08:00:00   1
1  2021-06-01 08:01:00   2
2  2021-06-01 08:02:00   3
3  2021-06-01 08:03:00   4
4  2021-06-01 08:04:00   5
  • df2 的 date 列存在部分时间缺失,样例数据如下:
df2 = pd.DataFrame({
    'date': ["2021-06-01 08:00:00", "2021-06-01 08:01:00", "2021-06-01 08:04:00"],
    'x2': [11, 22, 55]
})
print(df2)

输出结果:

date  x2
0  2021-06-01 08:00:00  11
1  2021-06-01 08:01:00  22
2  2021-06-01 08:04:00  55

需求是以 df1 为基准,按照 date 列将 df2 的 x2 列匹配添加到 df1 中,匹配不到的缺失位置填充 NaN 或字符串 MISSING。例如 2021-06-01 08:02:00、2021-06-01 08:03:00 两个时间在 df2 中不存在,预期合并结果如下:

date  x1    x2
0  2021-06-01 08:00:00   1  11.0
1  2021-06-01 08:01:00   2  22.0
2  2021-06-01 08:02:00   3   NaN
3  2021-06-01 08:03:00   4   NaN
4  2021-06-01 08:04:00   5  55.0
实现方法

方法1:使用pd.merge左连接(通用推荐)

通过how='left'参数指定以左表df1为基准做关联匹配,未匹配到的行默认填充NaN:

merged_df = pd.merge(df1, df2, on='date', how='left')

如果需要将缺失值替换为字符串MISSING,合并后调用fillna指定列填充即可:

merged_df = pd.merge(df1, df2, on='date', how='left').fillna({'x2': 'MISSING'})

方法2:使用map映射(仅匹配单列时更轻量)

如果只需要匹配单个字段,可以先把df2转成date到x2的映射字典,再直接给df1赋值新列:

# 构建日期到x2值的映射关系
x2_mapping = df2.set_index('date')['x2'].to_dict()
# 映射生成x2列,未匹配到的值默认返回NaN
df1['x2'] = df1['date'].map(x2_mapping)

需要填充MISSING时同样可以接fillna:

df1['x2'] = df1['date'].map(x2_mapping).fillna('MISSING')

注意:如果两表的date列格式不统一(比如一个是字符串、一个是datetime类型),需要先通过pd.to_datetime()把两列转成相同类型再做匹配,否则会出现匹配失败的问题。

内容的提问来源于stack exchange,提问作者efe373

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:18:21