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

时间:2020-10-28 16:37:46

标签: python pandas dataframe

我有2个pandas DataFrameact想要合并为一个数据帧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'])

数据框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 的列索引级别应比dfact多,并在其各自的level-0标识符下包含每个索引,如下所示:

exp

关于如何执行此操作的任何想法?


有点像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 划分两个帧:

merge

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

我尝试过:

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

我可以使用循环逐个建立#not working pd.DataFrame({'act': act, 'exp':exp}) 系列,但这似乎不正确。

非常感谢。

2 个答案:

答案 0 :(得分:5)

也许您可以尝试使用concat

pd.concat([act, exp], axis=1, keys=['act', 'exp'])

结果:

          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

答案 1 :(得分:-1)

import numpy as np
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'])
print(act)
print(exp)
df = pd.DataFrame(rand(3,4), columns=['act_a', 'act_b', 'exp_a', 'exp_c'])
# load data to act and exp
df['act_a'] = act['a']
df['act_b'] = act['b']
df['exp_a'] = exp['a']
df['exp_c'] = exp['c']
print(df)

输出:

          a         b
0  0.520894  0.451379
1  0.560014  0.427791
2  0.900554  0.326217
          a         c
0  0.766543  0.746780
1  0.207466  0.711153
2  0.341080  0.136082
      act_a     act_b     exp_a     exp_c
0  0.520894  0.451379  0.766543  0.746780
1  0.560014  0.427791  0.207466  0.711153
2  0.900554  0.326217  0.341080  0.136082