Home > other >  How to flatten this Dataframe
How to flatten this Dataframe

Time:09-30

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
  • Related