Панды: создавать новые (подуровневые) столбцы в мультииндексном фрейме данных и назначать значения - PullRequest
1 голос
/ 08 марта 2019

Давайте дадим фрейм данных, подобный следующему:

import pandas as pd 
import numpy as np

a = ['a', 'b']
b = ['i', 'ii']
mi = pd.MultiIndex.from_product([a,b], names=['first', 'second'])
A = pd.DataFrame(np.zeros([3,4]), columns=mi)
first     a         b
second    i   ii    i   ii
0       0.0  0.0  0.0  0.0
1       0.0  0.0  0.0  0.0
2       0.0  0.0  0.0  0.0

Я хотел бы создать новые столбцы iii для всех first -уровневых столбцов и назначить значение нового массива (соответствующего размера). Я попробовал следующее, но безрезультатно.

A.loc[:,pd.IndexSlice[:,'iii']] = np.arange(6).reshape(3,-1)

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

     a              b
     i   ii  iii    i   ii  iii
0  0.0  0.0  0.0  0.0  0.0  1.0
1  0.0  0.0  2.0  0.0  0.0  3.0
2  0.0  0.0  4.0  0.0  0.0  5.0

1 Ответ

1 голос
/ 08 марта 2019

Поскольку у вас есть несколько индексов в столбцах, я рекомендую создать дополнительное дополнение df, тогда concat его обратно

appenddf=pd.DataFrame(np.arange(6).reshape(3,-1),           
              index=A.index,
              columns=pd.MultiIndex.from_product([A.columns.levels[0],['iii']]))

appenddf
    a   b
  iii iii
0   0   1
1   2   3
2   4   5
A=pd.concat([A,appenddf],axis=1).sort_index(level=0,axis=1)
A
first     a             b         
second    i   ii iii    i   ii iii
0       0.0  0.0   0  0.0  0.0   1
1       0.0  0.0   2  0.0  0.0   3
2       0.0  0.0   4  0.0  0.0   5

Другое работоспособное решение

for i,x in enumerate(A.columns.levels[0]):
    A[x,'iii']=np.arange(6).reshape(3,-1)[:,i]
A
first     a         b        a   b
second    i   ii    i   ii iii iii
0       0.0  0.0  0.0  0.0   0   1
1       0.0  0.0  0.0  0.0   2   3
2       0.0  0.0  0.0  0.0   4   5
# here  I did not add `sort_index` 
...