添加具有部分重叠索引的 DataFrame

Adding DataFrames with partially overlapping indices

我有两个 Pandas DataFrames 我想加在一起,有一个日期时间索引和一组公共列。

日期时间索引将有 95% 的共同值,但 df2 中的某些行可能不在 df1 中,反之亦然。

我想将两个 DataFrame 加在一起,当其中一个 DataFrame 没有索引时,另一个 DataFrame 只是将其视为 0(或者取一个有值的,以哪个为准更好)。

结果应该删除任何索引,即类似外部连接的东西,而不是内部连接。

我已经尝试 pd.add,但是这似乎会降低 NaN 结果,因为两个 DataFrame 都没有条目。

pd.concat 在没有公共索引的地方工作,但在有公共索引的地方我得到重复而不是加在一起。我是否必须执行第二个 groupby 求和步骤?我以为会有更简单的方法来做到这一点。

例如:

第 1 帧

Month Val 1 Val 2
2022-01-01 1 2
2022-02-01 3 4
2022-03-01 5 6

第 2 帧

Month Val 1 Val 2
2022-03-01 101 102
2022-04-01 103 104
2024-01-01 105 106
2025-01-01 107 108

期望的结果

Month Val 1 Val 2
2022-01-01 1 2
2022-02-01 3 4
2022-03-01 106 108
2022-04-01 103 104
2024-01-01 105 106
2025-01-01 107 108

希望这对你有用:)

pd.concat([df1,df2]).groupby(["Month"]).sum().reset_index()

输出

    Month   Val1    Val2
0   2022-01-01  1   2
1   2022-02-01  3   4
2   2022-03-01  106 108
3   2022-04-01  103 104
4   2024-01-01  105 106
5   2025-01-01  107 108

假设“月份”是索引(如果不是先 set_index('Month')),我们可以使用 reindex 每个 DataFrame 与索引的联合,fillnaadd:

idx = df1.index.union(df2.index)
out = df1.reindex(idx).fillna(0).add(df2.reindex(idx).fillna(0)).astype(int)

输出:

            Val 1  Val 2
Month                   
2022-01-01      1      2
2022-02-01      3      4
2022-03-01    106    108
2022-04-01    103    104
2024-01-01    105    106
2025-01-01    107    108