Python - изменить, развернуть, развернуть - мультииндекс - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть датафрейм ниже, который я пытаюсь изменить. Я посмотрел, как это сделать, но я получаю несколько ответов и при попытке реализовать получение ошибок, имеющих дублирующийся индекс, или я получу только один широкий ряд данных. Варианты, которые я пробовал: unstack, pivot и ravel. Что было бы лучшим и самым простым способом изменить форму без итерации строк, что, я знаю, я мог бы решить, но я также знаю, что есть лучший способ.

Для ясности я привел снимок экрана с примером того, что у меня есть, и что я пытаюсь сделать:

Вот что у меня есть (но с тысячами строк)

enter image description here

Я пытаюсь переместить строки под тем же клиентом, неделей и типом, чтобы они находились на одной отдельной строке:

enter image description here

Чтобы выглядеть примерно так:

enter image description here

РЕДАКТИРОВАТЬ: Как указано ниже, просто быстрый образец набора данных. Я должен был предоставить с самого начала.

import pandas as pd

d = {'Customer': ['Store_A']*12,
 'Class': ['1A','1A','2B','2B','3C','3C']*2,
 'Week':['08/19/2018','08/26/2018']*6, 
 'Type':['Food']*6 + ['Beverage']*6, 
 'Value': [None,None,1,1.5,1.1,1.2,None,None,0.96,0.70,0.96,0.96]}

test_df = pd.DataFrame(data=d)

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете избежать дублирования имен столбцов в пандах, поэтому я рекомендовал добавить для него счетчик:

g = test_df.groupby(['Customer','Week', 'Type']).cumcount().astype(str)

df = test_df.set_index(['Customer','Week', 'Type', g]).unstack().sort_index(axis=1, level=1)
df.columns = df.columns.map('_'.join)

df = df.reset_index()
print (df)
  Customer        Week      Type Class_0  Value_0 Class_1  Value_1 Class_2  \
0  Store_A  08/19/2018  Beverage      1A      NaN      2B     0.96      3C   
1  Store_A  08/19/2018      Food      1A      NaN      2B     1.00      3C   
2  Store_A  08/26/2018  Beverage      1A      NaN      2B     0.70      3C   
3  Store_A  08/26/2018      Food      1A      NaN      2B     1.50      3C   

   Value_2  
0     0.96  
1     1.10  
2     0.96  
3     1.20  
...