简体   繁体   中英

Converting a Pandas dataframe to dictionary

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!

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}]}

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'}]}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM