在新的索引级别下合并熊猫数据框

ElR*_*udi 2 python dataframe pandas

我有2个pandas DataFrame小号act和exp我想结合成一个单一的数据帧df:

import pandas as pd
from numpy.random import rand
act = pd.DataFrame(rand(3,2), columns=['a', 'b'])
exp = pd.DataFrame(rand(3,2), columns=['a', 'c'])
Run Code Online (Sandbox Code Playgroud)
act #have

          a         b
0  0.853910  0.405463
1  0.822641  0.255832
2  0.673718  0.313768

exp #have

          a         c
0  0.464781  0.325553
1  0.565531  0.269678
2  0.363693  0.775927
Run Code Online (Sandbox Code Playgroud)

Dataframedf应该包含比actand多一个列索引级别exp,并且每个都包含在自己的级别 0 标识符下,如下所示:

df  #want

        act                 exp          
          a         b         a         c
0  0.853910  0.405463  0.464781  0.325553
1  0.822641  0.255832  0.565531  0.269678
2  0.673718  0.313768  0.363693  0.775927
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点的任何想法?


有点像mergeing 两帧:

act.merge(exp, left_index=True, right_index=True, suffixes=['_act', '_exp'])

      a_act         b     a_exp         c
0  0.853910  0.405463  0.464781  0.325553
1  0.822641  0.255832  0.565531  0.269678
2  0.673718  0.313768  0.363693  0.775927
Run Code Online (Sandbox Code Playgroud)

...但使用附加级别而不是后缀来防止名称冲突。

我试过:

#not working
pd.DataFrame({'act': act, 'exp':exp})  
Run Code Online (Sandbox Code Playgroud)

我可以使用循环来df逐个系列地构建,但这似乎不对。

非常感谢。

stu*_*ent 5

也许你可以尝试使用concat:

pd.concat([act, exp], axis=1, keys=['act', 'exp'])
Run Code Online (Sandbox Code Playgroud)

结果:

          act                      exp
       a           b             a           c
0   0.604027    0.933399    0.830059    0.317602
1   0.992192    0.991513    0.397223    0.904166
2   0.382579    0.981182    0.862077    0.239373
Run Code Online (Sandbox Code Playgroud)

  • 好答案。+1 (3认同)