我想连接两个具有相同索引但不同列级别的数据帧.一个数据帧具有分层索引,另一个数据帧不具有分层索引.
print df1
A_1 A_2 A_3 .....
Value_V Value_y Value_V Value_y Value_V Value_y
instance200 50 0 6500 1 50 0
instance201 100 0 6400 1 50 0
Run Code Online (Sandbox Code Playgroud)
另一个:
print df2
PV Estimate
instance200 2002313 1231233
instance201 2134124 1124724
Run Code Online (Sandbox Code Playgroud)
结果应如下所示:
PV Estimate A_1 A_2 A_3 .....
Value_V Value_y Value_V Value_y Value_V Value_y
instance200 2002313 1231233 50 0 6500 1 50 0
instance201 2134124 1124724 100 0 6400 1 50 0
Run Code Online (Sandbox Code Playgroud)
但是框架上的合并或连接将给我一个带有一维列索引的df,如下所示:
PV Estimate (A_1,Value_V) (A_1,Value_y) (A_2,Value_V) (A_2,Value_y) .....
instance200 2002313 1231233 50 0 6500 1
instance201 2134124 1124724 100 0 6400 1
Run Code Online (Sandbox Code Playgroud)
如何保持df1的层次结构索引?
也许使用好的任务:
df3 = df1.copy()
df3[df2.columns] = df2
Run Code Online (Sandbox Code Playgroud)
产量
A_1 A_2 A_3 PV Estimate
Value_V Value_y Value_V Value_y Value_V Value_y
instance200 50 0 6500 1 50 0 2002313 1231233
instance201 100 0 6400 1 50 0 2134124 1124724
Run Code Online (Sandbox Code Playgroud)
您可以通过使 df2 具有与 df1 相同的级别数来实现此目的:
In [11]: df1
Out[11]:
A_1 A_2 A_3
Value_V Value_y Value_V Value_y Value_V Value_y
instance200 50 0 6500 1 50 0
instance201 100 0 6400 1 50 0
In [12]: df2
Out[12]:
PV Estimate
instance200 2002313 1231233
instance201 2134124 1124724
In [13]: df2.columns = pd.MultiIndex.from_arrays([df2.columns, [None] * len(df2.columns)])
In [14]: df2
Out[14]:
PV Estimate
NaN NaN
instance200 2002313 1231233
instance201 2134124 1124724
Run Code Online (Sandbox Code Playgroud)
现在您可以在不破坏列名的情况下进行连接:
In [15]: pd.concat([df1, df2], axis=1)
Out[15]:
A_1 A_2 A_3 PV Estimate
Value_V Value_y Value_V Value_y Value_V Value_y NaN NaN
instance200 50 0 6500 1 50 0 2002313 1231233
instance201 100 0 6400 1 50 0 2134124 1124724
Run Code Online (Sandbox Code Playgroud)
注意:要首先使用 df2 列pd.concat([df2, df1], axis=1)
。
也就是说,我不确定我是否能想到一个用例,将它们保留为单独的 DataFrame 实际上可能是一个更简单的解决方案......!