Разделить столбцы pandas на два с помощью многоиндексного столбца

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

Мне нужно разделить DataFrame столбцы на два и добавить дополнительное значение в новый столбец. Суть в том, что мне нужно поднять исходные имена столбцов на один уровень выше и добавить два новых имени столбцов.

Учитывая DataFrame h :

 >>> import pandas as pd
>>> h = pd.DataFrame({'a': [0.6, 0.4, 0.1], 'b': [0.2, 0.4, 0.7]})
>>> h
      a    b
0   0.6  0.2
1   0.4  0.4
2   0.1  0.7
  

Мне нужно поднять исходные имена столбцов на один уровень и добавить два новых имени столбцов. Результат должен выглядеть следующим образом:

 >>> # some stuff...
                    a                  b
    expected received  expected received
0        0.6        1       0.2        1
1        0.4        1       0.4        1
2        0.1        1       0.7        1
  

Я пробовал это:

 >>> h['a1'] = [1, 1, 1]
>>> h['b1'] = [1, 1, 1]
>>> t = [('f', 'expected'),('f', 'received'), ('g', 'expected'), ('g', 'received')]
>>> h.columns = pd.MultiIndex.from_tuples(t)
>>> h
         f                 g         
  expected received expected received
0      0.6      0.2        1        1
1      0.4      0.4        1        1
2      0.1      0.7        1        1
  

Это просто переименовывает столбцы, но не выравнивает их должным образом. Я думаю, что проблема в том, что нет связи между a1 и b1 столбцами expected и received .

Как мне поднять исходные имена столбцов на один уровень и добавить два новых имени столбцов?

Ответ №1:

Я использую concat with keys , затем swaplevel

 h1=h.copy()
h1[:]=1
pd.concat([h,h1],keys=['expected', 'received'],axis=1).
    swaplevel(0,1,axis=1).
      sort_index(level=0,axis=1)
Out[233]: 
         a                 b         
  expected received expected received
0      0.6      1.0      0.2      1.0
1      0.4      1.0      0.4      1.0
2      0.1      1.0      0.7      1.0