如何合并两个具有不同列索引级别的Pandas数据帧?

Pat*_*son 6 python pandas

我想连接两个具有相同索引但不同列级别的数据帧.一个数据帧具有分层索引,另一个数据帧不具有分层索引.

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的层次结构索引?

unu*_*tbu 7

也许使用好的任务:

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)


And*_*den 4

您可以通过使 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 实际上可能是一个更简单的解决方案......!