Shaw
Shaw

Reputation: 1139

How to map a Pandas dataframe column to a nested dictionary

I have the following nested dictionary containing various classes, and inside these a set of key value pairs ...

['Class1': ['Param1': '0', 'Param2': '1', 'Param3': '2'], 'Class2': ['Param1': '4', 'Param2': '5', 'Param3': '6']]

I want to map the nested dictionary to a new column in a pandas dataframe which looks like the below ...

Class,Param
Class1,Param1
Class2,Param1
Class1,Param2
Class2,Param2
Class1,Param3
Class2,Param3

I'm not sure if this can be done using the map function in pandas, I can do the following using a simple dict

df['new_column'] = df['Param'].map(dict)

But I'm not sure how to map the column against a nested dictionary...

Upvotes: 1

Views: 2233

Answers (1)

jezrael
jezrael

Reputation: 862641

I think you need create Series by DataFrame constructor with unstack, rename_axis, create name of Series and then join:

d = {'Class1': {'Param1': '0', 'Param2': '1', 'Param3': '2'}, 
     'Class2': {'Param1': '4', 'Param2': '5', 'Param3': '6'}}

s = pd.DataFrame(d).unstack().rename_axis(('Class','Param')).rename('new_column')
print (s)
Class   Param 
Class1  Param1    0
        Param2    1
        Param3    2
Class2  Param1    4
        Param2    5
        Param3    6
Name: new_column, dtype: object

df = df.join(s, on=['Class','Param'])
print (df)
    Class   Param new_column
0  Class1  Param1          0
1  Class2  Param1          4
2  Class1  Param2          1
3  Class2  Param2          5
4  Class1  Param3          2
5  Class2  Param3          6

d = {'Class1': {'Param1': '0'}, 
     'Class2': {'Param1': '4', 'Param2': '5', 'Param3': '6'}}

s = pd.DataFrame(d).unstack().rename_axis(('Class','Param')).rename('new_column')
print (s)
Class   Param 
Class1  Param1      0
        Param2    NaN
        Param3    NaN
Class2  Param1      4
        Param2      5
        Param3      6
Name: new_column, dtype: object

df = df.join(s, on=['Class','Param'])
print (df)
    Class   Param new_column
0  Class1  Param1          0
1  Class2  Param1          4
2  Class1  Param2        NaN
3  Class2  Param2          5
4  Class1  Param3        NaN
5  Class2  Param3          6

Upvotes: 3

Related Questions