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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:48:29