簡體   English   中英

在 Python 中將嵌套的 JSON 轉換為 CSV

[英]Converting a nested JSON to CSV in Python

我想將嵌套的 json 轉換為 csv 文件。
我正在從 Rest API 接收 json。
csv 中的字段應如下所示。
daterange_start,daterange_end,clicks,impressions,pivotvalues。
我是 Python 和 JSON 的新手,所以很想得到一些幫助。
這是示例 json。

{
    "elements": [
        {
            "dateRange": {
                "start": {
                    "month": 3,
                    "year": 2019,
                    "day": 3
                },
                "end": {
                    "month": 3,
                    "year": 2019,
                    "day": 3
                }
            },
            "clicks": 11,
            "impressions": 2453,
            "pivotValues": [
                "urn:li:sponsoredCampaign:1234567"
            ]
        },
        {
            "dateRange": {
                "start": {
                    "month": 3,
                    "year": 2019,
                    "day": 7
                },
                "end": {
                    "month": 3,
                    "year": 2019,
                    "day": 7
                }
            },
            "clicks": 1,
            "impressions": 629,
            "pivotValues": [
                "urn:li:sponsoredCampaign:1234565"
            ]
        },
        {
            "dateRange": {
                "start": {
                    "month": 3,
                    "year": 2019,
                    "day": 21
                },
                "end": {
                    "month": 3,
                    "year": 2019,
                    "day": 21
                }
            },
            "clicks": 3,
            "impressions": 154,
            "pivotValues": [
                "urn:li:sponsoredCampaign:1323516"
            ]
        }
    ],
    "paging": {
        "count": 10,
        "start": 0,
        "links": []
    }
}

您可以使用以下命令在 python 中加載和解析 json:

import json
y = json.loads(x)

y將是一個 python 字典。 現在循環y['elements']並創建一個包含所需字段的列表。 例如提取開始和結束日期的年份:

list_for_csv=[]
for e in y['elements']:
    list_for_csv.append([e['daterange']['start']['year'],e['daterange']['end']['year']])

然后使用 numpy 保存為 csv:

import numpy as np
for_csv = np.asarray(list_for_csv)
np.savetxt("your_file.csv", for_csv, delimiter=",")

您可以使用json_normalize 唯一的問題是"pivotValues"是一個列表。 所以不確定你想要什么,或者這些列表中是否有超過 1 個元素。 如果它只是一個元素,您可以輕松處理該列。 如果它可以有多個元素,您可以為每個元素創建一個新行(意味着您有多個具有相同數據的行,除了不同的pivotValues ,或者您可以擴展每一行以具有每個pivotValues ,但隨后會pivotValues值列出不同的長度。

我還在那里添加了(看到pivotValues都具有相同的前綴),為您拆分帽子值,以防您需要它。

鑒於:

data = {
    "elements": [
        {
            "dateRange": {
                "start": {
                    "month": 3,
                    "year": 2019,
                    "day": 3
                },
                "end": {
                    "month": 3,
                    "year": 2019,
                    "day": 3
                }
            },
            "clicks": 11,
            "impressions": 2453,
            "pivotValues": [
                "urn:li:sponsoredCampaign:1234567"
            ]
        },
        {
            "dateRange": {
                "start": {
                    "month": 3,
                    "year": 2019,
                    "day": 7
                },
                "end": {
                    "month": 3,
                    "year": 2019,
                    "day": 7
                }
            },
            "clicks": 1,
            "impressions": 629,
            "pivotValues": [
                "urn:li:sponsoredCampaign:1234565"
            ]
        },
        {
            "dateRange": {
                "start": {
                    "month": 3,
                    "year": 2019,
                    "day": 21
                },
                "end": {
                    "month": 3,
                    "year": 2019,
                    "day": 21
                }
            },
            "clicks": 3,
            "impressions": 154,
            "pivotValues": [
                "urn:li:sponsoredCampaign:1323516"
            ]
        }
    ],
    "paging": {
        "count": 10,
        "start": 0,
        "links": []
    }
}

代碼:

import pandas as pd
from pandas.io.json import json_normalize


df = json_normalize(data['elements'])
df['pivotValues'] = df.pivotValues.apply(pd.Series).add_prefix('pivotValues_')
df['pivotValues_stripped'] = df['pivotValues'].str.rsplit(':',1, expand=True)[1]

df.to_csv('path/filename.csv', index=False)

輸出:

print (results.to_string())
   clicks  dateRange.end.day  dateRange.end.month  dateRange.end.year  dateRange.start.day  dateRange.start.month  dateRange.start.year  impressions                       pivotValues pivotValues_stripped
0      11                  3                    3                2019                    3                      3                  2019         2453  urn:li:sponsoredCampaign:1234567              1234567
1       1                  7                    3                2019                    7                      3                  2019          629  urn:li:sponsoredCampaign:1234565              1234565
2       3                 21                    3                2019                   21                      3                  2019          154  urn:li:sponsoredCampaign:1323516              1323516

暫無
暫無

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

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