#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, но это то, что я явно не ищу 😉