【问题标题】:How to convert a nested json column from postgresql database to dataframe with python or with query?如何使用 python 或查询将嵌套的 json 列从 postgresql 数据库转换为数据框?
【发布时间】:2017-03-06 07:56:06
【问题描述】:

如何使用 python 或使用直接查询将嵌套 json 从 postgresql 表转换为数据框?

json 对象的样子

[
  {
    "personName": "Aly Michalka",
    "characterName": "Aly Michalka",
    "creditType": "Actor"
  },
  {
    "personName": "Malcolm McDowell",
    "characterName": "Malcolm McDowell",
    "creditType": "Actor"
  },
  {
    "personName": "Lisa Kudrow",
    "characterName": "Lisa Kudrow",
    "creditType": "Actor"
  },
  {
    "personName": "Cam Gigandet",
    "characterName": "Cam Gigandet",
    "creditType": "Actor"
  },
  {
    "personName": "Patricia Clarkson",
    "characterName": "Patricia Clarkson",
    "creditType": "Actor"
  },
  {
    "personName": "Thomas Haden Church",
    "characterName": "Thomas Haden Church",
    "creditType": "Actor"
  },
  {
    "personName": "Amanda Bynes",
    "characterName": "Amanda Bynes",
    "creditType": "Actor"
  },
  {
    "personName": "Penn Badgley",
    "characterName": "Penn Badgley",
    "creditType": "Actor"
  },
  {
    "personName": "Emma Stone",
    "characterName": "Emma Stone",
    "creditType": "Actor"
  },
  {
    "personName": "Will Gluck",
    "characterName": "Will Gluck",
    "creditType": "Director"
  }
]

整个 json 对象应该对应于数据框的特定列。

【问题讨论】:

    标签: postgresql python-2.7


    【解决方案1】:

    要拆分您的数组,您可以使用jsonb_array_elements 函数。访问每个现场操作员->> - field->>'json field name'。如果您使用json 类型(不是jsonb),只需将函数名称从jsonb_array_elements 更改为json_array_elements。您可以在 https://www.postgresql.org/docs/9.5/static/functions-json.html 上找到所有可能的 json/jsonb 函数

    WITH x AS (
    SELECT '[{"personName":"Aly Michalka","characterName":"Aly Michalka","creditType":"Actor"},{"personName":"Malcolm McDowell","characterName":"Malcolm McDowell","creditType":"Actor"},{"personName":"Lisa Kudrow","characterName":"Lisa Kudrow","creditType":"Actor"},{"personName":"Cam Gigandet","characterName":"Cam Gigandet","creditType":"Actor"},{"personName":"Patricia Clarkson","characterName":"Patricia Clarkson","creditType":"Actor"},{"personName":"Thomas Haden Church","characterName":"Thomas Haden Church","creditType":"Actor"},{"personName":"Amanda Bynes","characterName":"Amanda Bynes","creditType":"Actor"},{"personName":"Penn Badgley","characterName":"Penn Badgley","creditType":"Actor"},{"personName":"Emma Stone","characterName":"Emma Stone","creditType":"Actor"},{"personName":"Will Gluck","characterName":"Will Gluck","creditType":"Director"}]'::jsonb AS a
    ), el AS (
       SELECT jsonb_array_elements(a) AS el FROM x
    )
    SELECT el->>'personName' as personName,
           el->>'characterName',
           el->>'creditType'
      FROM el
    
    
    
         personname      |    charactername    | credittype 
    ---------------------+---------------------+------------
     Aly Michalka        | Aly Michalka        | Actor
     Malcolm McDowell    | Malcolm McDowell    | Actor
     Lisa Kudrow         | Lisa Kudrow         | Actor
     Cam Gigandet        | Cam Gigandet        | Actor
     Patricia Clarkson   | Patricia Clarkson   | Actor
     Thomas Haden Church | Thomas Haden Church | Actor
     Amanda Bynes        | Amanda Bynes        | Actor
     Penn Badgley        | Penn Badgley        | Actor
     Emma Stone          | Emma Stone          | Actor
     Will Gluck          | Will Gluck          | Director
    

    【讨论】:

    • 您能否建议一种无需硬编码的方法?
    • 如果你想使用你的数据库 - WITH el AS (SELECT jsonb_array_elements(your_json_field) AS el FROM your_json_table ) SELECT el->>'personName' as personName, ...。如果您的意思是动态 json 结构,您可能需要 stackoverflow.com/questions/42403321/…
    猜你喜欢
    • 2019-05-09
    • 2021-06-13
    • 2021-09-06
    • 1970-01-01
    • 2023-01-12
    • 2019-07-08
    • 2021-01-02
    相关资源
    最近更新 更多