如何基于共同日期列合并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
相关产品推荐
相关产品推荐

