2016-08-21 6 views
5

У меня есть dataframe с MultiIndex. Мне интересно, правильно ли я создал фрейм данных (см. Ниже).DataFrame с MultiIndex to dict

   01.01 02.01 03.01 04.01 
bar total1  40  52  18  11 
    total2  36  85  5  92 
baz total1  23  39  45  70 
    total2  50  49  51  65 
foo total1  23  97  17  97 
    total2  64  56  94  45 
qux total1  13  73  38  4 
    total2  80  8  61  50 

df.index.values приводит:

array([('bar', 'total1'), ('bar', 'total2'), ('baz', 'total1'), 
     ('baz', 'total2'), ('foo', 'total1'), ('foo', 'total2'), 
     ('qux', 'total1'), ('qux', 'total2')], dtype=object) 

df.index.get_level_values результатов в:

<bound method MultiIndex.get_level_values of MultiIndex(levels=[[u'bar', u'baz', u'foo', u'qux'], [u'total1', u'total2']], 
      labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]],names=[] 

Я в конечном счете стремится превратить ФР в Словаре словарей таким образом, что первый ключ ДИКТ являются одним ['bar', 'baz', 'foo', 'qux'], а значениями являются даты, а внутренний словарь состоит из «total1» и «totalals2» в качестве ключа, а значения являются целыми числами df. Альтернативное объяснение, является, например, если dict1 является ДИКТ то вызов:

dict1['bar'] 

приведет к выходу:

{u'bar':{'01.01':{'total1':40,'total2':36},'02.01':{'total1':52,'total2':85},'03.01':{'total1':18,'total2':5},'04.01':{'total1':11,'total2':92} } } 

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

+0

ли вы попробовать 'df.to_dict()'? – albert

+0

@albert yes и 'df.to_dict()' приводит к: '{'01 .01 ': {(' bar ',' total1 '): 40, (' bar ',' total2 '): 36, (' baz ' , 'total1'): 23, ('baz', 'total2'): 50, 'etc ..' df.to_dict ('index') 'приводит к:' ('bar', 'total1'): {' 01.08 ': 40, '02 .08': 52, '03 .08 ': 18, '04 .08': 11}, ('bar', 'total2'): {'01 .08 ': 36, '02 .08': 85, '03 .08 ' : 5, '04 .08 ': 92} '. Поэтому он приближает меня к тому, где я хочу быть, поэтому я подумал, что это может быть проблемой с формированием кадра данных. – OAK

+0

Вы можете взглянуть на поддерживаемые параметры/параметры для 'df.to_csv()', поскольку они позволяют вам манипулировать способом преобразования данных: http://pandas.pydata.org/pandas-docs/stable/generated/ pandas.DataFrame.to_dict.html Я бы предложил 'df.to_csv ('index')', но не пробовал. – albert

ответ

5

Для преобразования целого dataframe словарю Попробуйте:

df.groupby(level=0).apply(lambda df: df.xs(df.name).to_dict()).to_dict() 

{'bar': {'01.01': {'total1': 40, 'total2': 36}, 
    '02.01': {'total1': 52, 'total2': 85}, 
    '03.01': {'total1': 18, 'total2': 5}, 
    '04.01': {'total1': 11, 'total2': 92}}, 
'baz': {'01.01': {'total1': 23, 'total2': 50}, 
    '02.01': {'total1': 39, 'total2': 49}, 
    '03.01': {'total1': 45, 'total2': 51}, 
    '04.01': {'total1': 70, 'total2': 65}}, 
'foo': {'01.01': {'total1': 23, 'total2': 64}, 
    '02.01': {'total1': 97, 'total2': 56}, 
    '03.01': {'total1': 17, 'total2': 94}, 
    '04.01': {'total1': 97, 'total2': 45}}, 
'qux': {'01.01': {'total1': 13, 'total2': 80}, 
    '02.01': {'total1': 73, 'total2': 8}, 
    '03.01': {'total1': 38, 'total2': 61}, 
    '04.01': {'total1': 4, 'total2': 50}}} 

Для преобразования одного определенного столбца, выберите перед преобразованием его в словарь т.е.

df.groupby(level=0).apply(lambda df: df.xs(df.name)[colname].to_dict()).to_dict() 
+0

@piRSquard попробует, что спасибо – OAK

+0

Отличный ответ сэр. – Dark

+0

@jezrael его большой ответ уже. Почувствовал, как завершить его для будущих читателей. – Dark

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