2016-03-11 5 views
3

У меня есть csv, который генерируется в формате, который я не могу изменить. Файл имеет мультииндекс. Файл выглядит следующим образом.Multiindex только некоторые из столбцов в Pandas

enter image description here

Конечная цель состоит в свою очередь верхнего ряда (часы) в индекс и индекс его с колонкой «ID», так что данные выглядит следующим образом.

enter image description here

Я импортировал файл в панд ...

myfile = 'c:/temp/myfile.csv' 
df = pd.read_csv(myfile, header=[0, 1], tupleize_cols=True) 
pd.set_option('display.multi_sparse', False) 
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['hour', 'field']) 
df 

Но это дает мне три неназванных поля:

enter image description here

Мой последний шаг заключается в стек на час:

df.stack(level=['hour']) 

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

ответ

4

Я считаю, что линии вам не хватает, может быть # 3 и 4:

df = pd.io.parsers.read_csv('temp.csv', header = [0,1], tupleize_cols = True) 
df.columns = [c for _, c in df.columns[:3]] + [c for c in df.columns[3:]] 
df = df.set_index(list(df.columns[:3]), append = True) 
df.columns = pd.MultiIndex.from_tuples(df.columns, names = ['hour', 'field']) 
  1. Преобразование кортежи в строки, понижая первое значение для первых 3 цв. заголовки.
  2. Устанавливайте эти заголовки, помещая их в указатель.

После выполнения команды stack вы можете сбросить индекс, если хотите.

например.

Перед

(Unnamed: 0_level_0, Date) (Unnamed: 1_level_0, id) \ 
0     3/11/2016       5 
1     3/11/2016       6 

    (Unnamed: 2_level_0, zone) (100, p1) (100, p2) (200, p1) (200, p2) 
0      abc  0.678  0.787  0.337  0.979 
1      abc  0.953  0.559  0.776  0.520 

После

field      p1  p2 
    Date  id zone hour    
0 3/11/2016 5 abc 100 0.678 0.787 
        200 0.337 0.979 
1 3/11/2016 6 abc 100 0.953 0.559 
        200 0.776 0.520 
+0

спасибо, Яким. –

+0

Я рад, что смогу помочь. –

Смежные вопросы