Cleb
Cleb

Reputation: 25997

groupby one column and convert remaining columns to dictionary

I have a dataframe like this

import pandas as pd

df = pd.DataFrame({'keyid': ['d1', 'd1', 'd2', 'd2'],
                   'keys': ['key1', 'key2', 'key1', 'key2'],
                   'vals': ['val1', 'val2', 'val3', 'val4']})

  keyid  keys  vals
0    d1  key1  val1
1    d1  key2  val2
2    d2  key1  val3
3    d2  key2  val4

which I want to convert into

{'d1': {'key1': 'val1', 'key2': 'val2'},
 'd2': {'key1': 'val3', 'key2': 'val4'}}

The closest I got is:

print(df.groupby('keyid')['keys', 'vals'].apply(lambda g: g.to_dict(orient='records')).to_dict())

which prints

'd1': [{'keys': 'key1', 'vals': 'val1'}, {'keys': 'key2', 'vals': 'val2'}],
'd2': [{'keys': 'key1', 'vals': 'val3'}, {'keys': 'key2', 'vals': 'val4'}]}

I could now modify this dictionary further, but is there a more straightforward way of doing this?

Upvotes: 1

Views: 60

Answers (1)

jezrael
jezrael

Reputation: 862511

You are close, only need dictionary in apply with dict and values:

print(df.groupby('keyid')['keys', 'vals'].apply(lambda x: dict(x.values)).to_dict())
{'d1': {'key1': 'val1', 'key2': 'val2'}, 
 'd2': {'key1': 'val3', 'key2': 'val4'}}

Upvotes: 3

Related Questions