簡體   English   中英

Convert JSON to CSV Nested JSON with Python Pandas

[英]Convert JSON to CSV Nested JSON with Python Pandas

我有一個 python 腳本,它可以獲取一個 JSON 文件並使用 Pandas json_normalize ZC1C51AB408D163 提取我想要的特定列。 但是我在 JSON 中有一個嵌套的 JSON 值集,我試圖將其拉出但無法獲取代碼以正確獲取這些值。

下面是 JSON 值。 頂層是“cardEditions”,該層是“cardDetails”。 我想從這個嵌套的 json 中獲取一些 displayName 和 value 詳細信息,並將它們放入帶有 cardEditions 和 editionNo 值的 csv 中。

Looking for the output to be in a CSV pipe delimited like the following with the displayValues as the headers from the nested json.

版本號 姓名 Position
666 馬特胡 第 1 版 中心場
{
    "cardEditions": [{
        "editionNo": 666,
        "id": 1111,
        "cardDetails": [{
                "valueType": "Text",
                "displayValueType": "Text",
                "displayName": "Name",
                "value": "Matt Hu"
            },
            {
                "valueType": "Text",
                "displayValueType": "Text",
                "displayName": "Edition",
                "value": "1st Edition"
            },
            {
                "valueType": "Text",
                "displayValueType": "Text",
                "displayName": "Position",
                "value": "Center Field"
            }

        ],
        "cardStatus": "NA"
    }]
}
import pandas as pd

d = {
    "cardEditions": [{
        "editionNo": 666,
        "id": 1111,
        "cardDetails": [{
                "valueType": "Text",
                "displayValueType": "Text",
                "displayName": "Name",
                "value": "Matt Hu"
            },
            {
                "valueType": "Text",
                "displayValueType": "Text",
                "displayName": "Edition",
                "value": "1st Edition"
            },
            {
                "valueType": "Text",
                "displayValueType": "Text",
                "displayName": "Position",
                "value": "Center Field"
            }

        ],
        "cardStatus": "NA"
    }]
}

df = pd.DataFrame(columns=['editionNo', 'Name', 'Edition', 'Position'])
for i, edition in enumerate(d['cardEditions']):
    no = edition['editionNo']
    vals = [details['value'] for details in edition['cardDetails']]
    df.loc[i, :] = (no, *vals)
print(df)

印刷

指數 版本號 姓名 Position
0 666 馬特胡 第 1 版 中心場

這是json_normalizepivot的另一個解決方案。

# where "j" is your json data
out = (
    pd.json_normalize(json.loads(j)['cardEditions'], record_path=['cardDetails'], meta='editionNo')
    .drop(['valueType', 'displayValueType'],axis=1)
    .pivot(index='editionNo', columns='displayName', values='value')
    .rename_axis(columns=None)
    .reset_index()
)
print(out)

Output:

   editionNo      Edition     Name      Position
0        666  1st Edition  Matt Hu  Center Field

如果有人知道如何將json_normalize與我們不想要所有字段的record_path一起使用,我真的很想知道。 我不得不從 record_path 中刪除列,因為我不知道如何首先跳過它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM