Jonathan Hay
Jonathan Hay

Reputation: 315

How to create a dictionary of series with an index from a dataframe in python

I have the following dataframe

df = pd.DataFrame({'col_1': ['Animal','Deer','Sheep','Fish','Vehicle','Truck','Car','Mineral','Gold','Silver'], 
                   'col_2': ['Animal',0.5,0.25,0.25,'Vehicle',0.5,0.5,'Mineral',0.75,0.25],
                   'Group': [0,0,0,0,1,1,1,2,2,2]})

I want to create a dictionary of series. I want column 1 to be the index, column 2 the value and Group to specify the series. EG the name (key) for the first series would be "Animal" and it should look like:
enter image description here

I've tried the following. But it's not right, I'm getting a dictionary of dataframes instead of series and the headers are in the first row.

dict_of_series = {i: df.loc[df.group == i, ['col_1', 'col_2']] for i in range(1, df.group.iat[-1])} 

Upvotes: 2

Views: 108

Answers (1)

jezrael
jezrael

Reputation: 862661

Use dictionary comprhension for loop by groupby object with DataFrame.set_axis for set columnsnames by first row per groups, remove first row and last column by indexing in DataFrame.iloc and last remove columns names in DataFrame.rename_axis :

dict_of_series = {g['col_2'].iat[0]: 
                  g.set_axis(g.iloc[0], axis=1).iloc[1:, :-1].rename_axis(None, axis=1) 
                  for i, g in df.groupby('Group')} 


print (dict_of_series['Animal'])
  Animal Animal
1   Deer    0.5
2  Sheep   0.25
3   Fish   0.25

print (dict_of_series['Vehicle'])
  Vehicle Vehicle
5   Truck     0.5
6     Car     0.5

print (dict_of_series['Mineral'])
  Mineral Mineral
8    Gold    0.75
9  Silver    0.25

For Series use DataFrame.set_index before solution and also change iloc for select last column to Series and last Series.rename_axis:

df = df.set_index('col_1')

dict_of_series = {g['col_2'].iat[0]: 
                  g.set_axis(g.iloc[0], axis=1).iloc[1:, 0].rename_axis(None)
                  for i, g in df.groupby('Group')} 


print (dict_of_series['Animal'])
Deer      0.5
Sheep    0.25
Fish     0.25
Name: Animal, dtype: object

Upvotes: 1

Related Questions