Home > database >  Is there a way to convert pandas columns with list of nested dicts to rows?
Is there a way to convert pandas columns with list of nested dicts to rows?

Time:10-01

I have a pandas dataframe with a column containing a list of nested dictionaries

import pandas as pd
import numpy as np

df = pd.DataFrame({"Column_1" : [
                                 [{'PID': '03', 'Col_par': [{'PID': '01', 'mace': [{'all': 100, 'd_Loc': 'front'}]}]}],
                                np.nan,
                                [{'PID': '01', 'Col_par': [{'PID': '02', 'mace': [{'all': 100, 'd_Loc': 'driver side'}]}]}],
                                [{'PID': '01', 'Col_par': [{'PID': '11', 'mace': [{'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '14', 'mace': [{'all': 23, 'd_Loc': 'rear'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 0, 'd_Loc': 'rear'}]}]}, 
                                {'PID': '06', 'Col_par': [{'PID': '11', 'mace': [{'all': 0, 'd_Loc': 'front'}]},
                                                        {'PID': '01', 'mace': [{'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '14', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '10', 'mace': [{'all': 0, 'd_Loc': 'rear'}]}]}, 
                                {'PID': '14', 'Col_par': [{'PID': '11', 'mace': [{'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '01', 'mace': [{'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 25, 'd_Loc': 'rear'}, 
                                                                                {'all': 100, 'd_Loc': 'front'}]}, 
                                                        {'PID': '10', 'mace': [{'all': 100, 'd_Loc': 'rear'}]}]}, 
                                {'PID': '11', 'Col_par': [{'PID': '01', 'mace': [{'all': 100, 'd_Loc': 'front'}]}, 
                                                        {'PID': '14', 'mace': [{'all': 53, 'd_Loc': 'rear'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 0, 'd_Loc': 'rear'}]}]}, 
                                {'PID': '10', 'Col_par': [{'PID': '14', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}]}],
                                [{'PID': '03', 'Col_par': [{'PID': '01', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '09', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}]}, 
                                {'PID': '06', 'Col_par': [{'PID': '01', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '03', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '09', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}]}, 
                                {'PID': '08', 'Col_par': [{'PID': '01', 'mace': [{'all': 100, 'd_Loc': 'rear'}, 
                                                                                {'all': 100, 'd_Loc': 'front'}]}, 
                                                        {'PID': '03', 'mace': [{'all': 100, 'd_Loc': 'rear'}, 
                                                                                {'all': 100, 'd_Loc': 'front'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 100, 'd_Loc': 'rear'}, 
                                                                                {'all': 100, 'd_Loc': 'front'}]}, 
                                                        {'PID': '09', 'mace': [{'all': 100, 'd_Loc': 'rear'}, 
                                                                                {'all': 100, 'd_Loc': 'front'}]}]}, 
                                {'PID': '09', 'Col_par': [{'PID': '01', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '03', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}]}, 
                                {'PID': '01', 'Col_par': [{'PID': '03', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '06', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}, 
                                                        {'PID': '09', 'mace': [{'all': 0, 'd_Loc': 'rear'}, 
                                                                                {'all': 0, 'd_Loc': 'front'}]}]}]],
                   "Key" : [1, 2, 3, 4, 5],
                   "Val_1": [25, 46, 75, 85, 89]})

Data:

    Column_1                                          Key Val_1
0   [{'PID': '03', 'Col_par': [{'PID': '01', 'mace...   1    25
1   NaN                                                 2    46
2   [{'PID': '01', 'Col_par': [{'PID': '02', 'mace...   3    75
3   [{'PID': '01', 'Col_par': [{'PID': '11', 'mace...   4    85
4   [{'PID': '03', 'Col_par': [{'PID': '01', 'mace...   5    89

I want to extract values in the nested dictionaries and transform the nested list of dictionaries into rows.

PID_Val,  Col_par_PID,  PID_mace_all,  PID_d_loc,  Key,  Val1
'03',            '01',           100,    'front',    1,    25
np.nan,        np.nan,        np.nan,     np.nan,    2,    46
'01',            '02',           100,'driver side',  3,    75
'01',            '11',             0,    'front',    4,    85
'01',            '14',            23,     'rear',    4,    85
'01',            '06',             0,     'rear',    4,    85
'06',            '11',             0,    'front',    4,    85
'06',            '01',             0,    'front',    4,    85
'06',            '14',             0,     'rear',    4,    85

  # And soooo on

How to transform column of nested dictionaries into pandas rows?

CodePudding user response:

Try:

df = df[['Key', 'Val_1']].join(df['Column_1'].explode().apply(pd.Series)[['Col_par', 'PID']])
df.rename(columns={'PID':'PID_Val'}, inplace=True)
df = df[['Key', 'Val_1', 'PID_Val']].join(df['Col_par'].explode().apply(pd.Series)[['PID', 'mace']])
df.rename(columns={'PID': 'Col_par_PID'}, inplace=True)
df = df[['Key', 'Val_1', 'PID_Val', 'Col_par_PID']].join(df['mace'].explode().apply(pd.Series)[['all', 'd_Loc']])
df.rename(columns={'all': 'PID_mace_all', 'd_Loc': 'PID_d_loc'}, inplace=True)
df = df[['PID_Val', 'Col_par_PID', 'PID_mace_all', 'PID_d_loc', 'Key', 'Val_1']]

OUTPUT:

   PID_Val Col_par_PID  PID_mace_all    PID_d_loc  Key  Val_1
0       03          01         100.0        front    1     25
1      NaN         NaN           NaN          NaN    2     46
2       01          02         100.0  driver side    3     75
3       01          11           0.0        front    4     85
3       01          11          23.0         rear    4     85
..     ...         ...           ...          ...  ...    ...
4       01          09           0.0        front    5     89
4       01          09           0.0         rear    5     89
4       01          09           0.0        front    5     89
4       01          09           0.0         rear    5     89
4       01          09           0.0        front    5     89
  • Related