Dictionary from data frame. Values assigned to tuple keys derived from column, row products

Given a data frame structured as follows:

df = pd.DataFrame({
    'DATE' : [1,2,3,4,5],
    'Q24' : [23.28, 28.81, 29.32, 29.8, 30.25],
    'J24' : [24.22, 24.89, 25.54, 26.15, 26.73],
    'F24' : [22.34, 32.73, 33.1, 33.45, 33.77]
})

I would like to create a dictionary in which all keys are tuples containing the products of values in df['DATES'] and elements in df.columns[1:]. I would then like to assign the relevant values from the data frame to those keys.

So far, I have achieved this by creating an empty dictionary of the requisite keys:

import itertools
keys = list(itertools.product(df['DATE'],df.columns[1:]))
dict1 = dict.fromkeys(keys)

Then creating a list containing a dictionary for each relevant column:

dict2 = df.iloc[:,1:].to_dict('records')

I’ve then used a for loop to assign values to keys in dict1:

for x in df['DATE']:
    for y in df.columns[1:]:
        dict1[x,y] = dict2[x-1][y]

Which correctly produces the desired output:


{(1, 'Q24'): 23.28,(1, 'J24'): 24.22,(1, 'F24'): 22.34,
 (2, 'Q24'): 28.81,(2, 'J24'): 24.89,(2, 'F24'): 32.73,
 (3, 'Q24'): 29.32,(3, 'J24'): 25.54,(3, 'F24'): 33.1,
 (4, 'Q24'): 29.8,(4, 'J24'): 26.15,(4, 'F24'): 33.45,
 (5, 'Q24'): 30.25,(5, 'J24'): 26.73,(5, 'F24'): 33.77}

However, this feels like something of an ugly monstrosity of code and I wondered if there was a more elegant means to achieve the same output?

Help and guidance much appreciated!

>Solution :

Set DATE as the index and stack

df.set_index('DATE').stack().to_dict()

{(1, 'Q24'): 23.28,
 (1, 'J24'): 24.22,
 (1, 'F24'): 22.34,
 (2, 'Q24'): 28.81,
 (2, 'J24'): 24.89,
 (2, 'F24'): 32.73,
 (3, 'Q24'): 29.32,
 (3, 'J24'): 25.54,
 (3, 'F24'): 33.1,
 (4, 'Q24'): 29.8,
 (4, 'J24'): 26.15,
 (4, 'F24'): 33.45,
 (5, 'Q24'): 30.25,
 (5, 'J24'): 26.73,
 (5, 'F24'): 33.77}

Leave a Reply