如何展平此数据框

Posted

技术标签:

【中文标题】如何展平此数据框【英文标题】:How to flatten this Dataframe 【发布时间】:2021-11-20 11:50:01 【问题描述】:

我有由 ID 和一列组成的数据框。该列在每个单元格中都有字典列表。我想要的是对其进行规范化和展平,因此我将拥有许多从这些字典中出现的列,而不是一列。

                                            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 看起来像这样,我想要的不是列 LoadNodes,而是 Id、Description、Name 等列。当我使用此命令时:

pd.DataFrame(pd.json_normalize(load_only_df['LoadNodes']), index = load_only_df.index)

我收到以下输出...

    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

编辑 1: “df = pd.json_normalize(load_only_df['LoadNodes']) 的输出是什么?NaN 的原因是使用 index = load_only_df.index,如果删除它是什么输出? - 耶斯瑞尔 1 分钟前”

这是您发布的命令的输出。

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

【问题讨论】:

df = pd.json_normalize(load_only_df['LoadNodes']) 的输出是什么? NaNs 的原因是使用index = load_only_df.index,如果删除它,输出是什么? 我在帖子中添加了编辑。 如果您提供一个创建要重塑的结构的数据框的最小示例,也会更容易。至于解决方案,pandas.pydata.org/pandas-docs/stable/reference/api/… 做你需要的吗? 【参考方案1】:

IIUC 使用Series.explode:

df = pd.json_normalize(load_only_df['LoadNodes'].explode())

如果重要的还有索引值,这里SubProjectId使用:

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

【讨论】:

以上是关于如何展平此数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中展平数组

如何展平具有相同 id 的多行的 pandas 数据框

如何展平熊猫数据框多列中的字典列表

如何展平多个嵌套的 json 并转换为数据框?

如何将 JSON 格式的数据展平为 spark 数据框

如何使用嵌套字典列表展平熊猫数据框中的列