Reputation: 51
I have a Pandas Dateframe:
+-----------+-------+---------+
| kpi_name | coeff | measure |
+-----------+-------+---------+
| messi | 2 | DoD |
| ronaldo | 1.5 | MTD |
| del_piero | 2 | MTD |
+-----------+-------+---------+
I need to convert this to a dictionary like :
{'MTD':[{'KPI':'ronaldo', 'measure':'1.5'}, {'KPI:':'messi', 'measure':'2'],
'DoD':['KPI':'messi', 'measure':'1.4']}
I am trying:
a = df.groupby('measure').apply(lambda x: x.to_dict('list')).to_dict()
My output:
{'MTD': {'kpi_name': ['ronaldo', 'del_piero'], 'coeff': [1.5, 2.0], 'measure': ['MTD', 'MTD']}, 'DoD': {'kpi_name': ['messi'], 'coeff': [2.0], 'measure': ['DoD']}}
Thx a lot of help!
Upvotes: 1
Views: 94
Reputation: 164833
Using a dictionary comprehension with GroupBy
:
df = pd.DataFrame({'kpi_name': ['messi', 'ronaldo', 'del_piero'],
'coeff': [2, 1.5, 2],
'measure': ['DoD', 'MTD', 'MTD']})
res = {k: grp.to_dict(orient='records') for k, grp in df.groupby('measure')}
print(res)
{'DoD': [{'kpi_name': 'messi', 'coeff': 2.0, 'measure': 'DoD'}],
'MTD': [{'kpi_name': 'ronaldo', 'coeff': 1.5, 'measure': 'MTD'},
{'kpi_name': 'del_piero', 'coeff': 2.0, 'measure': 'MTD'}]}
Upvotes: 1
Reputation: 30
Please look into slicing dataframes and transpose T
for future reference.
Given a dataframe
df = pd.DataFrame({'KPI':['messi', 'ronaldo', 'del_piero'],\
'coeff':[2, 1.5, 2], \
'measure':['DoD', 'MTD', 'MTD']})
You can use the following lambda function
df.groupby('measure').apply(lambda x: list(x[['KPI','coeff']].T.to_dict().values())).to_dict()
To achieve your expected output
{'DoD': [{'KPI': 'messi', 'coeff': 2.0}],
'MTD': [{'KPI': 'ronaldo', 'coeff': 1.5}, {'KPI': 'del_piero', 'coeff': 2.0}]}
Upvotes: 1