I have Dataframe that consists of ID and one column. That column has list of dictionaries in each cell. What I want is normalize it and flatten, so instead of having one column, I will have many of columns that appear from these dicts.
LoadNodes
SubProjectId
56409 [{'Id': 2, 'Description': None, 'Name': None, ...
56410 [{'Id': 2, 'Description': None, 'Name': None, ...
56411 [{'Id': 2, 'Description': None, 'Name': None, ...
56412 [{'Id': 2, 'Description': None, 'Name': None, ...
56414 [{'Id': 3, 'Description': None, 'Name': None, ...
... ...
56505 [{'Id': 2, 'Description': None, 'Name': None, ...
56506 [{'Id': 2, 'Description': None, 'Name': None, ...
56507 [{'Id': 2, 'Description': None, 'Name': None, ...
56508 [{'Id': 2, 'Description': None, 'Name': None, ...
56509 [{'Id': 2, 'Description': None, 'Name': None, ...
87 rows × 1 columns
Dataframe looks like that and I want instead of column LoadNodes, columns like Id, Description, Name etc. When I'm using this command:
pd.DataFrame(pd.json_normalize(load_only_df['LoadNodes']), index = load_only_df.index)
I receive following output...
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
SubProjectId
56409 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56410 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56411 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56412 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56414 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
56505 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56506 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56507 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56508 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
56509 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
87 rows × 46 columns
Edit 1: "What is ouput of df = pd.json_normalize(load_only_df['LoadNodes']) ? Reason for NaNs is using index = load_only_df.index, if remove it what is ouput? – jezrael 1 min ago"
This is the output of the command you've posted.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
0 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
1 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
2 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
3 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
4 {'Id': 3, 'Description': None, 'Name': None, '... {'Id': 4, 'Description': None, 'Name': None, '... {'Id': 5, 'Description': None, 'Name': None, '... {'Id': 6, 'Description': None, 'Name': None, '... {'Id': 7, 'Description': None, 'Name': None, '... {'Id': 8, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
82 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
83 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
84 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
85 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
86 {'Id': 2, 'Description': None, 'Name': None, '... None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None None
87 rows × 46 columns
CodePudding user response:
IIUC use Series.explode
:
df = pd.json_normalize(load_only_df['LoadNodes'].explode())
If important are also index values, here SubProjectId
use:
load_only_df = pd.DataFrame({'LoadNodes':[[{'Id': 2, 'Description': None, 'Name': None},
{'Id': 7, 'Description': None, 'Name': None},
{'Id': 8, 'Description': None, 'Name': None}],
[{'Id': 20, 'Description': None, 'Name': None},
{'Id': 71, 'Description': None, 'Name': None},
{'Id': 80, 'Description': None, 'Name': None}]]
}, index=[500, 123])
s = load_only_df['LoadNodes'].explode()
df = pd.json_normalize(s).set_index(s.index)
print(df)
Id Description Name
500 2 None None
500 7 None None
500 8 None None
123 20 None None
123 71 None None
123 80 None None