Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DataFrame with MultiIndex to dict

Tags:

I have a dataframe with a MultiIndex. I am wondering whether I created the data frame in the correct manner (see below).

             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 results in:

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

df.index.get_level_values results in:

<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=[] 

I am ultimately looking to transform the df into a dict of dictionaries such that the first dict key are one of ['bar','baz', 'foo','qux'] and values are the dates and the inner dictionary is made of 'total1' and 'totals2' as key and the values are the integers of the df. Alternative explanation, is for example if dict1 is the dict then calling:

dict1['bar'] 

would result in the output:

{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} } } 

How and what would I need to alter in order to achieve this? Is this an indexing issue?

like image 748
OAK Avatar asked Aug 21 '16 19:08

OAK


People also ask

How do you convert a DataFrame to a dictionary?

To convert pandas DataFrame to Dictionary object, use to_dict() method, this takes orient as dict by default which returns the DataFrame in format {column -> {index -> value}} . When no orient is specified, to_dict() returns in this format.

How convert MultiIndex to columns in pandas?

A multi-index dataframe has multi-level, or hierarchical indexing. We can easily convert the multi-level index into the column by the reset_index() method. DataFrame. reset_index() is used to reset the index to default and make the index a column of the dataframe.

What is MultiIndex DataFrame?

The MultiIndex object is the hierarchical analogue of the standard Index object which typically stores the axis labels in pandas objects. You can think of MultiIndex as an array of tuples where each tuple is unique. A MultiIndex can be created from a list of arrays (using MultiIndex.

How do you convert a series to a dictionary?

to_dict() function is used to convert Series to Dictionary (dict) object. Use this method if you have a Series with a relevant index and want to convert it to a python dictionary (dict) object by converting indices of series as keys and the values of series as values. Series.


1 Answers

For converting whole dataframe to dictionary Try:

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}}} 

For converting one particular column, select before converting it to dictionary i.e

df.groupby(level=0).apply(lambda df: df.xs(df.name)[colname].to_dict()).to_dict() 
like image 134
piRSquared Avatar answered Oct 23 '22 11:10

piRSquared