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