在一个级别上合并MultiIndex数据帧

时间:2018-12-30 19:48:24

标签: python pandas

我正在尝试在第一级上连接两个多索引数据框。我曾尝试使用其他一些解决方案,例如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

1 个答案:

答案 0 :(得分:3)

由于级别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

如果您的null中有DataFrames个值,并且不想用nulls更新df2中的df1,则可以先替换它们带有伪值(例如999999),并在合并后用NaN替换。

相关问题