python 使用json_normalize函数创建关系数据模型?

icomxhvb  于 2022-11-28  发布在  Python
关注(0)|答案(1)|浏览(142)

我有一个嵌套的Python字典,我想把它转换成一个关系模型。我正在努力把字典解析成两个相关的表:“workspace”表和“datasets”表-通过关键字workspace_id连接

simplified_dict ={
   "workspaces":[
      {
         "workspace_id":"d507422c",
         "workspace_name":"Workspace 1",
         "datasets":[
            {
               "dataset_id":"e7e8a355",
               "dataset_name":"Dataset 1 in workspace 1"
            },
            {
               "dataset_id":"bbe8a355",
               "dataset_name":"Dataset 2 in workspace 1"
            }
         ]
      },
      {
         "workspace_id":"etyyy422c-8d6d",
         "workspace_name":"Workspace 2",
         "datasets":[
            {
               "dataset_id":"89jke8a355",
               "dataset_name":"Dataset 3 in Workspace 2"
            },
            {
               "dataset_id":"tyii8a355",
               "dataset_name":"Dataset 4 in workspace 2"
            }
         ]
      }
   ],
   "datasourceInstances":[
      
   ]
}

我可以使用pandas json_normalize函数创建一个包含工作空间信息的表。

import pandas as pd
df_workspaces = pd.json_normalize(simplified_dict, record_path=['workspaces'])
df_workspaces

然而,当我尝试使用相同的函数创建第二个表“datasets”时,我得到了一个 Dataframe ,但它没有工作区键,这允许我连接两个表。

df_datasets_in_workspaces = pd.json_normalize(simplified_dict, record_path=['workspaces','datasets'])
df_datasets_in_workspaces

有没有办法在仍然使用json_normalize函数的情况下,将工作区键添加到this datasets表中以启用连接?
如果可能的话,我更喜欢使用json_normalize的解决方案,而不是使用循环或理解,因为json_normalize允许我轻松地将我的真实的数据的任何层(具有5层嵌套)转换为 Dataframe 。使用我的真实数据集,我将希望生成大约15个表,所以一个低代码,非常直观的方法是首选。
google colab notebook with the code is accessible here的副本
任何帮助都将不胜感激。

9o685dep

9o685dep1#

workspace_df = pd.json_normalize(data=simplified_dict, record_path=["workspaces"]).drop(columns="datasets")
print(workspace_df)

datasets_df = pd.json_normalize(data=simplified_dict["workspaces"], meta=["workspace_id"], record_path=["datasets"])
print(datasets_df)

备选方案:

datasets_df = pd.json_normalize(
    data=simplified_dict,
    meta=[["workspaces", "workspace_id"]],
    record_path=["workspaces", "datasets"]
)
datasets_df.columns = datasets_df.columns.str.split(".").str[-1]

输出:

workspace_id workspace_name
0        d507422c    Workspace 1
1  etyyy422c-8d6d    Workspace 2

   dataset_id              dataset_name    workspace_id
0    e7e8a355  Dataset 1 in workspace 1        d507422c
1    bbe8a355  Dataset 2 in workspace 1        d507422c
2  89jke8a355  Dataset 3 in Workspace 2  etyyy422c-8d6d
3   tyii8a355  Dataset 4 in workspace 2  etyyy422c-8d6d

相关问题