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

如何基于共同日期列合并Pandas数据框指定列生成新数据框

Pandas按日期列合并多DataFrame并保留所有记录

问题场景

现有两个DataFrame数据:

import pandas as pd
df1 = pd.DataFrame({'A' : ['1960-01-01','1961-01-01','1962-01-01','1963-01-01'], 'B1' : [10,20,15,25], 'C1' : [100,50,45,105], 'D1' : [-30,-50,-25,-10]})

df2 = pd.DataFrame({'A' : ['1962-01-01','1963-01-01','1964-01-01','1965-01-01'], 'B2' : [120,250,105,205], 'C2' : [10,5,4.5,10], 'D2' : [-3,-5,-205,-1]})

需要以日期列A为公共列,合并指定列(仅保留A、B1、B2),保留所有日期记录,缺失值用NaN填充,期望输出:

df = pd.DataFrame({'A' : ['1960-01-01','1961-01-01','1962-01-01','1963-01-01','1964-01-01','1965-01-01'], 'B1' : [10,20,15,25,None,None], 'B2' : [None,None,120,250,105,205]})

此前尝试pd.concat和pd.merge时出现记录丢失问题,未得到理想结果。

解决方案

使用pd.merge的外连接(outer join),同时提前筛选需要保留的列,即可实现需求:

# 筛选每个DataFrame中需要的列,减少冗余数据
df1_filtered = df1[['A', 'B1']]
df2_filtered = df2[['A', 'B2']]

# 按日期列A执行外连接,保留所有日期记录
merged_df = pd.merge(df1_filtered, df2_filtered, on='A', how='outer')

print(merged_df)

运行后输出结果与期望一致:

A    B1     B2
0 1960-01-01  10.0    NaN
1 1961-01-01  20.0    NaN
2 1962-01-01  15.0  120.0
3 1963-01-01  25.0  250.0
4 1964-01-01   NaN  105.0
5 1965-01-01   NaN  205.0

问题原因分析

  • 使用pd.concat时若未对齐索引或未指定正确轴方向,会导致记录错位或丢失;
  • 使用pd.merge时若未设置how='outer',默认是内连接(inner join),仅保留两个DataFrame共有的日期,从而丢失独有的记录;
  • 未提前筛选列虽不会直接导致记录丢失,但会生成冗余列,不符合输出要求。

扩展:合并多个DataFrame

如果有更多同类DataFrame需要合并,可借助functools.reduce循环执行外连接:

from functools import reduce

# 假设存在df3、df4等,先统一筛选需要的列
df_collection = [df1[['A', 'B1']], df2[['A', 'B2']], df3[['A', 'B3']]]

# 循环合并所有DataFrame
final_merged = reduce(lambda left, right: pd.merge(left, right, on='A', how='outer'), df_collection)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:37:49