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?
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.
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.
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.
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.
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With