Pandas Dataframe MultiIndex преобразует один уровень мультииндекса в другую ось, сохраняя другой уровень в исходной оси - PullRequest
0 голосов
/ 12 июня 2018

У меня есть панды Dataframe с MultiIndex в индексаторах строк, таких как:

enter image description here

Этот кадр данных является результатом groupby операция, а затем нарезка из 3-уровневого MultiIndex. Мне бы хотелось, чтобы индексатор строк 'date' остался, но сместил уровень индексаторов строк 'SlabType' в индексатор столбцов с недоступными значениями как NaN.

Вот что я хотел бы получить:

enter image description here

Какие операции мне нужно выполнить, чтобы добиться этого?Также, если заголовок вопроса может быть улучшен, пожалуйста, предложите.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Поскольку у вас есть NaN значения для некоторых записей, вы можете рассмотреть сводную таблицу , чтобы избежать "повторяющихся записей" ValueError при разблокировании одного из индексов.

Предположим, у вас есть df DataFrame со столбцом 'SlabLT' с индексами date и SlabType, попробуйте:

df.reset_index().pivot_table(values = 'SlabLT', index = 'date', columns = 'SlabLT')

0 голосов
/ 12 июня 2018

Используйте unstack с выбранным столбцом SlabLT:

print (df['SlabLT'].unstack())

Но если возможно дублирование в MultiIndex, необходим агрегированный столбец, ag на mean:

print (df.groupby(level=[0,1])['SlabLT'].mean().unstack())

Пример :

df = pd.DataFrame({'date':['2017-10-01','2017-10-08','2017-10-08','2017-10-15', '2017-10-15'],
                   'SlabType':['UOM2','AMOUNT','UOM2','AMOUNT','AMOUNT'],
                   'SlabLT':[1,6000,1,6000,5000]}).set_index(['date','SlabType'])

print (df)
                     SlabLT
date       SlabType        
2017-10-01 UOM2           1
2017-10-08 AMOUNT      6000
           UOM2           1
2017-10-15 AMOUNT      6000 <-duplicated MultiIndex '2017-10-15', 'AMOUNT'
           AMOUNT      5000 <-duplicated MultiIndex '2017-10-15', 'AMOUNT'

print (df['SlabLT'].unstack())

ValueError: Индекс содержит повторяющиеся записи, не может изменить форму


print (df.groupby(level=[0,1])['SlabLT'].mean())
date        SlabType
2017-10-01  UOM2           1
2017-10-08  AMOUNT      6000
            UOM2           1
2017-10-15  AMOUNT      5500
Name: SlabLT, dtype: int64

print (df.groupby(level=[0,1])['SlabLT'].mean().unstack())
SlabType    AMOUNT  UOM2
date                    
2017-10-01     NaN   1.0
2017-10-08  6000.0   1.0
2017-10-15  5500.0   NaN
...