2013-08-28 6 views
2

Я пытаюсь найти DataFrame для проведения некоторого анализа данных, и мне бы очень понравилось иметь фрейм данных, который может обрабатывать регулярную индексацию и MultiIndexing вместе в одном кадре данных.Сочетание мультииндекса и индекса в PANDAS DataFrame

Для каждого пациента у меня есть 6 ломтиков различных типов данных (T1avg, T2avg и т. Д.). Давайте назовем это dataframe1 (от IPython ноутбука):

import pandas 
dat0 = numpy.zeros([6]) 
dat1 = numpy.zeros([6]) 
pat0=(['NecS3Hs05']*6) 
pat1=(['NecS3Hs06']*6) 

slc = (['Slice ' + str(x) for x in xrange(dat0.shape[-1])]) 

ind = zip(*[pat0+pat1,slc+slc]) 

named_ind = pandas.MultiIndex.from_tuples(ind, names = ['Patients','Slices']) 
ser = pandas.Series(numpy.append(dat0,dat1),index = named_ind) 
df = pandas.DataFrame(data=ser, columns=['T1avg']) 

Изображения выхода: df1

У меня тоже есть, для каждого пациента, различные строки информации (типа опухоли, количество сеансов визуализации, тип лечения):

pats = ['NecS3Hs05','NecS3Hs05'] 
tx = ['Control','Treated'] 
Ttype = ['subcutaneous','orthotopic'] 
NSessions = ['2','3'] 

cols = ['Tx Group', 'Tumour Type', 'Imaging Sessions'] 
dat = numpy.array([tx,Ttype,NSessions]).T 

df2 = pandas.DataFrame(dat, index=pats,columns=cols) 

[Я хотел бы опубликовать фотографию здесь, как хорошо, но мне нужно, по крайней мере, 10 репутации сделать это]

в идеале, я хочу есть dataframe, который выглядит следующим образом (в общих чертах его в редакторе изображений пардон)

Изображение желаемых результатов: df-desired

Но когда я пытаюсь использовать команду Append,

com = df.append(df2) 

Я получаю что-то нежелательное, MultiIndex, который я установил в df, теперь ушел, заменен простым индексом типов кортежей («NecS3Hs05, Slice 0» и т. д.). Индексы из df2 остаются теми же «NecS3Hs05».

Возможно ли это сделать с PANDAS, или я не лажу здесь неправильное дерево? Кроме того, это даже рекомендуемый способ хранения атрибутов пациента в фреймворке данных (т. Е. Это неудобно)? Я думаю, что мне бы хотелось, чтобы все было простым индексом, но вместо этого храните N-d массивы внутри элементов фрейма данных.

Например, если я пытаюсь что-то вроде:

com['NecS3Hs05','T1avg'] 

Я хочу, чтобы получить массив/кортеж формы/Len 6

и когда я пытаюсь получить тип опухоли:

com['NecS3Hs05','Tumour Type'] 

Я получаю строку подкожной. Очевидно, что я также хочу сохранить классные функции фреймов данных, похоже, что PANDAS - это правильный путь, я просто должен понять немного больше о том, как настроить мой фрейм данных.

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

+0

P.S. Он чувствует себя «неправильно» (['NecS3Hs05'] * 6), чтобы заполнить записи и настроить MultiIndex таким образом, есть ли у кого лучший способ? – Firas

+0

Я бы просто использовал обычный DataFrame с опухолью и т. Д. Info, дублированный по нескольким строкам. – BrenBarn

+0

@BrenBarn Я считаю, что это OP указывает в df-желаемом – DrSAR

ответ

1

Ваша проблема может быть решена, я считаю, если вы бросите бизнес MultiIndex. Представьте, что '' 'df' '' имеет только (не уникальный) «Пациент» в качестве индекса. «Ломтики» станут простой колонкой.

ind = zip(*[pat0+pat1]) 
named_ind = pandas.MultiIndex.from_tuples(ind, names = ['Patients']) 
df = pandas.DataFrame({'T1avg':ser}) 
df['Slice']=pandas.Series(numpy.append(slc, slc), index=df.index) 

Если вы должны были выбрать на срезе, вы можете сделать это:

df[df['Slice']=='Slice 4'] 

Даст вам Кусочек 4 для всех пациентов. Обратите внимание, что это устраняет необходимость иметь эту строку для всех пациентов.

Пока ваш новый dataframe (df2) определяет тот же индекс, теперь вы можете присоединиться по этому индексу довольно просто:

df.join(df2) 

и вы получите

   T1avg Slice Tx Group Tumour Type Imaging Sessions 
Patients               
NecS3Hs05  0 Slice 0 Control subcutaneous    2 
NecS3Hs05  0 Slice 1 Control subcutaneous    2 
NecS3Hs05  0 Slice 2 Control subcutaneous    2 
NecS3Hs05  0 Slice 3 Control subcutaneous    2 
NecS3Hs05  0 Slice 4 Control subcutaneous    2 
NecS3Hs05  0 Slice 5 Control subcutaneous    2 
NecS3Hs06  0 Slice 0 Treated orthotopic    3 
NecS3Hs06  0 Slice 1 Treated orthotopic    3 
NecS3Hs06  0 Slice 2 Treated orthotopic    3 
NecS3Hs06  0 Slice 3 Treated orthotopic    3 
NecS3Hs06  0 Slice 4 Treated orthotopic    3 
NecS3Hs06  0 Slice 5 Treated orthotopic    3 
+0

Я тоже подумал об этом, но в крайнем случае. Пара причин: 1) Данные дублируются без необходимости. Я знаю, что размер экрана небольшой, но все же кажется бесполезным для организации моих данных таким образом. 2) Если есть что-то, что я хочу сохранить уникальным в кадре данных, это информация о пациенте, поэтому более легкая операция позже «получить» всех пациентов, у которых есть ортотопические контрольные опухоли, у которых было 2 сеанса визуализации (таким образом, быть дополнительной операцией для захвата уникальных записей. – Firas

+1

3) MultiIndexing просто кажется таким классным, когда описано в видео Wes и в документации http://pandas.pydata.org/pandas-docs/stable/indexing.html#hierarchical -СБОРОЧНЫЙ-мультииндекс. Я рад пойти с этим методом, хотя, если нет других предложений! – Firas

+2

ИМХО 'MultiIndex' следует избегать, если вокруг нет никакого пути. Вы можете легко переместить свои «MultiIndex» в столбцы, используя некоторую комбинацию 'stack' /' unstack'/'reset_index' /' melt'. Запросы будут быстрее и * намного проще, если ваши индексы будут столбцами в вашем «DataFrame». –

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