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