Как сделать несколько столбцов from_tuples?

Я понимаю, как использовать pd.MultiIndex.from_tuples(), чтобы изменить что-то вроде

       Value
(A,a)  1
(B,a)  2
(B,b)  3

в

                Value
Caps Lower      
A    a          1
B    a          2
B    b          3

Но как изменить кортежи столбцов в форме

       (A, a)  (A, b) (B,a)  (B,b)
index
1      1       2      2      3
2      2       3      3      2
3      3       4      4      1

в форму

 Caps         A              B
 Lower        a       b      a      b
 index
 1            1       2      2      3
 2            2       3      3      2
 3            3       4      4      1

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


Редактировать: Причина, по которой у меня есть заголовок столбца кортежа, заключается в том, что когда я присоединял DataFrame с одноуровневым столбцом к DataFrame с многоуровневым столбцом, он превращал несколько столбцов в формат кортежа строк. и оставил один уровень как одну строку.


Редактировать 2 — Альтернативное решение: как уже говорилось, проблема здесь возникла из-за join с другим размером уровня столбца. Это означало, что Multi-Column был сокращен до кортежа строк. Чтобы обойти эту проблему, до присоединения я использовал df.columns = [('col_level_0','col_level_1','col_level_2')] для DataFrame, к которому хотел присоединиться.


person Little Bobby Tables    schedule 15.06.2016    source источник


Ответы (2)


Назначить напрямую columns с результатом pd.MultiIndex.from_tuples передавая существующие столбцы:

In [186]:
l=[('A', 'a'),  ('A', 'b'), ('B','a'),  ('B','b')]
df = pd.DataFrame(np.random.randn(5,4), columns = l)
df

Out[186]:
     (A, a)    (A, b)    (B, a)    (B, b)
0 -0.876353  0.553742  1.631858 -0.561309
1  0.463058 -0.455014 -0.491336 -1.436059
2  0.337810  0.233624 -0.571749 -2.259763
3  1.073057 -0.475894  0.999643 -0.379743
4  0.441800  0.311202 -0.191552  0.291268

In [187]:    
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
df

Out[187]:
Caps          A                   B          
Lower         a         b         a         b
0     -0.876353  0.553742  1.631858 -0.561309
1      0.463058 -0.455014 -0.491336 -1.436059
2      0.337810  0.233624 -0.571749 -2.259763
3      1.073057 -0.475894  0.999643 -0.379743
4      0.441800  0.311202 -0.191552  0.291268

обратите внимание, что вы можете назначить непосредственно атрибуту names атрибута columns, как показано ниже:

df.columns.names = ['Caps','Lower']

не путать с атрибутом name

person EdChum    schedule 15.06.2016
comment
Хорошо, может быть, я не понял, как использовать его для индексов, иначе я бы понял, какое тонкое изменение было необходимо. Теперь я думаю, что понимаю оба немного лучше! Спасибо. - person Little Bobby Tables; 15.06.2016
comment
@Edchum, я думаю, что несправедливо копировать мое решение с параметрами в функции from_tuples - см. редакцию. Но это зависит от вас. Удачи! - person jezrael; 15.06.2016
comment
Мне показалось излишним устанавливать атрибут имен в качестве дополнительного шага, я не копировал ваше решение, несмотря на то, что вы думаете, кроме того, между этими двумя ответами очень небольшая разница, если вы игнорируете шаг именования, поскольку фундаментальным моментом является тот факт, что OP хотел преобразовать имена кортежей столбцов в иерархический индекс. - person EdChum; 15.06.2016
comment
Да, Readability counts.. Хороший день! - person jezrael; 15.06.2016

Другое решение — использовать MultiIndex.from_tuples с параметром names :

import pandas as pd

df = pd.DataFrame({'Value': [1,2,3]}, index=[('A','a'),('B','a'),('B','b')])
print (df)
        Value
(A, a)      1
(B, a)      2
(B, b)      3

df.index = pd.MultiIndex.from_tuples(df.index, names=['Caps','Lower'])
print (df)
            Value
Caps Lower       
A    a          1
B    a          2
     b          3

То же самое работает с columns, см. Edchum's answer:

df.columns= pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
person jezrael    schedule 15.06.2016
comment
Да, моя ошибка заключалась в том, что я увидел, что мне нужно назначить его df.columns, а не df.index, но это поможет другим, которые еще не видели df.index = pd.MultiIndex.from_tuples(df.index) и так далее. Спасибо. - person Little Bobby Tables; 15.06.2016