如何用Pandas按日期合并三个DataFrame并保留全部日期
问题描述
我有三个DataFrame:
DataFrame df1
date A 0 2022-04-11 1 1 2022-04-12 2 2 2022-04-14 26 3 2022-04-16 2 4 2022-04-17 1 5 2022-04-20 17 6 2022-04-21 14 7 2022-04-22 1 8 2022-04-23 9 9 2022-04-24 1 10 2022-04-25 5 11 2022-04-26 2 12 2022-04-27 21 13 2022-04-28 9 14 2022-04-29 17 15 2022-04-30 5 16 2022-05-01 8 17 2022-05-07 1241217 18 2022-05-08 211 19 2022-05-09 1002521 20 2022-05-10 488739 21 2022-05-11 12925 22 2022-05-12 57 23 2022-05-13 8515098 24 2022-05-14 1134576
DataFrame df2
date B 0 2022-04-12 8 1 2022-04-14 7 2 2022-04-16 2 3 2022-04-19 2 4 2022-04-23 2 5 2022-05-07 2 6 2022-05-08 5 7 2022-05-09 2 8 2022-05-14 1
DataFrame df3
date C 0 2022-04-12 6 1 2022-04-13 1 2 2022-04-14 2 3 2022-04-20 3 4 2022-04-21 9 5 2022-04-22 25 6 2022-04-23 56 7 2022-04-24 49 8 2022-04-25 68 9 2022-04-26 71 10 2022-04-27 40 11 2022-04-28 44 12 2022-04-29 27 13 2022-04-30 34 14 2022-05-01 28 15 2022-05-07 9 16 2022-05-08 20 17 2022-05-09 24 18 2022-05-10 21 19 2022-05-11 8 20 2022-05-12 8 21 2022-05-13 14 22 2022-05-14 25 23 2022-05-15 43 24 2022-05-16 36 25 2022-05-17 29 26 2022-05-18 28 27 2022-05-19 17 28 2022-05-20 6
我希望将df1, df2, df3合并为一个包含date、A、B、C列的DataFrame,要求:
date列包含三个DataFrame中出现的所有不重复日期- 若某日期未出现在某个DataFrame中,对应列填充
0.0
预期结果示例:
date A B C 0 2022-04-11 1.0 0.0 0.0 1 2022-04-12 2.0 8.0 6.0 2 2022-04-13 0.0 0.0 1.0 ...
我尝试了以下方法,但发现会跳过并非三个DataFrame共有的日期:
merge1 = pd.merge(df1, df2, how='outer') sorted_merge1 = merge1.sort_values(by=['date'], ascending=False) full_merge = pd.merge(sorted_merg1, df3, how='outer')
解决方法
你的问题核心是两次merge未明确指定按date列合并,且存在变量名拼写错误(sorted_merg1应为sorted_merge1),导致合并逻辑出现偏差。以下是两种可靠的解决方案:
方案一:多次指定关联列的Outer Merge
# 合并df1和df2,明确按date列做outer合并 merge_ab = pd.merge(df1, df2, on='date', how='outer') # 合并结果与df3继续按date列outer合并 full_merge = pd.merge(merge_ab, df3, on='date', how='outer') # 填充缺失值为0.0,按日期排序并重置索引 full_merge = full_merge.fillna(0.0).sort_values(by='date').reset_index(drop=True)
方案二:使用concat结合索引合并(更高效)
# 将每个DataFrame的date设为索引,按列拼接所有数据 full_merge = pd.concat( [df1.set_index('date'), df2.set_index('date'), df3.set_index('date')], axis=1, join='outer' ).reset_index() # 填充缺失值为0.0,排序并重置索引 full_merge = full_merge.fillna(0.0).sort_values(by='date').reset_index(drop=True)
两种方案都能完整保留所有日期,缺失值自动填充为0.0,最终结果符合预期。
内容的提问来源于stack exchange,提问作者Ziva
相关产品推荐
相关产品推荐

