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