объединить фреймы данных pandas под новым уровнем индекса

#python #pandas #dataframe

#python #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'])
  
 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
  

df Фрейм данных должен содержать на один уровень индекса столбца больше, чем act и 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
  

Есть идеи относительно того, как это сделать?


Это немного похоже 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})  
  

Я мог бы использовать циклы для создания df серии за серией, но это не кажется правильным.

Большое спасибо.

Комментарии:

1. @Manakin спасибо за разъяснение. Это пришло мне в голову при вводе сообщения. Итак, я удалил свой комментарий.

Ответ №1:

Может быть, вы можете попробовать использовать 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. Это именно то, чего я хотел. Большое спасибо за этот молниеносный ответ

2. Отлично! Happy Coding .

Ответ №2:

 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
  

Комментарии:

1. Спасибо за ответ Aaj, но это то, что я явно не ищу 😉