添加具有部分重叠索引的 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 与索引的联合,fillna
和 add
:
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
我有两个 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 与索引的联合,fillna
和 add
:
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