合并上的多索引数据帧

2024-06-16 08:38:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在第一层上连接两个多索引数据帧。我尝试过其他一些解决方案,比如this one,但对我来说不太管用。我希望在某种程度上是一个外部连接,但我也希望匹配索引中的值被df2中的值替换。否则,关于如何在第一级上轻松执行outer合并的一些有用提示也将非常有用。你知道吗

设置:

dates1 = pd.to_datetime(['1/11/2016','5/11/2016','9/11/2016'])
dates2 = pd.to_datetime(['1/11/2016','4/11/2016','8/11/2016','9/11/2016'])
v1 = pd.MultiIndex.from_arrays([[112,112,112], dates1])
v2 = pd.MultiIndex.from_arrays([[113,113,113, 113], dates2])
df1 = pd.DataFrame({'active1':[3,3,4],'active2':[5,1,10]}, index = v1)
df2 = pd.DataFrame({'active1':[1,22,12,5],'active2':[5,1,12,13]}, index = v2)

print(df1)
                  active1  active2
112 2016-01-11        3        5
    2016-05-11        3        1
    2016-09-11        4       10

print(df2)
                   active1  active2
113 2016-01-11        1        5
    2016-04-11       22        1
    2016-08-11       12       12
    2016-09-11        5       13

预期产量:

                  active1  active2
112 2016-01-11        1        5
    2016-04-11       22        1
    2016-05-11        3        1
    2016-08-11       12       12
    2016-09-11        5       13

Tags: tofromdataframedatetimev2pddf1v1
1条回答
网友
1楼 · 发布于 2024-06-16 08:38:14

由于级别0的值是唯一的,请忽略它,使用.combine_first合并另一个索引上的DataFrames,匹配时优先考虑df2中的值,然后将索引从df1添加回末尾

(df2.reset_index(0, drop=True)
    .combine_first(df1.reset_index(0, drop=True))
    .assign(l0 = df1.index[0][0])
    .set_index('l0', append=True)
    .swaplevel(0,1)
    .rename_axis([None, None], 0))

输出

                active1  active2
112 2016-01-11      1.0      5.0
    2016-04-11     22.0      1.0
    2016-05-11      3.0      1.0
    2016-08-11     12.0     12.0
    2016-09-11      5.0     13.0

如果您的DataFrames中有null值,并且您不希望df2中的nullsdf1更新,那么您可以首先用伪值替换它们(如999999),然后在合并后用NaN替换回来。你知道吗

相关问题 更多 >