Reputation: 1139
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
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