Как создать многоуровневый фрейм данных в pandas?

Учитывая два разных df:

'A'

            a  b         
2016-11-21  2  1
2016-11-22  3  4
2016-11-23  5  2 
2016-11-24  6  3 
2016-11-25  6  3

'B'

            a  b         
2016-11-21  3  0
2016-11-22  1  0
2016-11-23  1  6 
2016-11-24  1  5 
2016-11-25  0  2

Как я могу создать «многоуровневый» кадр данных этой формы:

'C'

            A     B
            a  b  a  b           
2016-11-21  2  1  3  0
2016-11-22  3  4  1  0
2016-11-23  5  2  1  6
2016-11-24  6  3  1  5
2016-11-25  6  3  0  2

* index - это объект "datatime"

Спасибо


person hernanavella    schedule 26.11.2016    source источник


Ответы (2)


Один из вариантов — использовать MultiIndex() для создания уровня столбцов для A и B, а затем объединить их:

import pandas as pd
A.columns = pd.MultiIndex.from_product([['A'], A.columns])
B.columns = pd.MultiIndex.from_product([['B'], B.columns])
pd.concat([A, B], axis = 1)

#           A       B
#           a   b   a   b
#2016-11-21 2   1   3   0
#2016-11-22 3   4   1   0
#2016-11-23 5   2   1   6
#2016-11-24 6   3   1   5
#2016-11-25 6   3   0   2
person Psidom    schedule 26.11.2016
comment
Почему бы просто не использовать MultiIndex.from_product() один раз для результирующего df? результат = pd.concat([A, B], axis=1) result.columns = pd.MultiIndex.from_product([('A', 'B'), A.columns]) - person Alex; 26.11.2016
comment
Кроме того, почему первый уровень вашего столбцового мультииндекса не выровнен так, как в ответе Джезраэля? - person Alex; 26.11.2016
comment
Если два фрейма данных имеют разные измерения или разные имена столбцов, использование MultiIndex для результата не сработает. Первый уровень выравнивается так же, как ответ Израэля, если вы проверите ответ. Я, наверное, по-другому здесь сделал отступ. - person Psidom; 26.11.2016

Вы можете использовать concat с параметром keys:

df = pd.concat([A, B], axis = 1, keys=(list('AB')))
print (df)
            A     B   
            a  b  a  b
2016-11-21  2  1  3  0
2016-11-22  3  4  1  0
2016-11-23  5  2  1  6
2016-11-24  6  3  1  5
2016-11-25  6  3  0  2
person jezrael    schedule 26.11.2016