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
相关产品推荐
相关产品推荐

