【问题标题】:Converting nested JSON object to pandas Dataframe将嵌套的 JSON 对象转换为 pandas 数据框
【发布时间】:2021-12-21 05:50:31
【问题描述】:

我正在处理一个包含嵌套字段(数组)的 JSON 文件。我正在尝试将其转换为 Pandas 数据框。

{
    "_id": "2026",
    "dataDate": 1537920000000,
    "dataYear": 2018,
    "groupId": "1378",
    "HourConsumed": 19781.4,
    "HourGenerated": 0,
    "max": 4658.400000000001,
    "maxGen": 0,
    "maxTime": 1538001000000,
    "avg": -206.05625,
    "max": 0,
    "maxGen": 0,
    "maxTime": null,
    "avgTemp": 0,
    "me_Id": "2004506_3166155129",
    "interval": 15,
    "intervalMetaData": [
        "whC",
        "whG",
        "max",
        "maxGen",
        "hC",
        "hG",
        "maxVar",
        "maxGen",
        "avgTemp",
        "eventTime"
    ],
    "intervalData": [
        [
            175.2,
            0,
            700.8,
            0,
            0,
            0,
            0,
            0,
            0,
            1537920900000
        ],
        [
            192,
            0,
            768,
            0,
            0,
            0,
            0,
            0,
            0,
            1537921800000
        ],
        [
            191.39999999999998,
            0,
            765.5999999999999,
            0,
            0,
            0,
            0,
            0,
            0,
            1537922700000
        ]
    ]
}

我需要为 intervalMetaData 中的内容创建单独的列,然后用来自 intervalData 的值填充这些列。有可能吗?

【问题讨论】:

    标签: json pandas dataframe nested-json


    【解决方案1】:

    如果我理解正确,您只需通过使用 pandas 导入列表来正确设置列:

    import pandas as pd
    
    data = {
        "_id": "2026",
        "dataDate": 1537920000000,
        "dataYear": 2018,
        "groupId": "1378",
        "HourConsumed": 19781.4,
        "HourGenerated": 0,
        "max": 4658.400000000001,
        "maxGen": 0,
        "maxTime": 1538001000000,
        "avg": -206.05625,
        "max": 0,
        "maxGen": 0,
        "maxTime": None,
        "avgTemp": 0,
        "me_Id": "2004506_3166155129",
        "interval": 15,
        "intervalMetaData": [
            "whC",
            "whG",
            "max",
            "maxGen",
            "hC",
            "hG",
            "maxVar",
            "maxGen",
            "avgTemp",
            "eventTime"
        ],
        "intervalData": [
            [
                175.2,
                0,
                700.8,
                0,
                0,
                0,
                0,
                0,
                0,
                1537920900000
            ],
            [
                192,
                0,
                768,
                0,
                0,
                0,
                0,
                0,
                0,
                1537921800000
            ],
            [
                191.39999999999998,
                0,
                765.5999999999999,
                0,
                0,
                0,
                0,
                0,
                0,
                1537922700000
            ]
        ]
    }
    
    
    df = pd.DataFrame(data["intervalData"], columns=data["intervalMetaData"])
    print(df)
    

    输出:

         whC  whG    max  maxGen  hC  hG  maxVar  maxGen  avgTemp      eventTime
    0  175.2    0  700.8       0   0   0       0       0        0  1537920900000
    1  192.0    0  768.0       0   0   0       0       0        0  1537921800000
    2  191.4    0  765.6       0   0   0       0       0        0  1537922700000
    

    编辑:您可以将其他键添加为带有循环的列:

    for k,v in data.items():
        if k not in ["intervalData", "intervalMetaData"]:
            df[k] = v
    

    【讨论】:

    • 太好了。是否可以在同一个数据框中获取其他字段?我理解可能会重复,但这不是问题
    • 当然!我在答案中添加了一个循环
    【解决方案2】:

    你打赌这是可能的!就这么简单:

    df = pd.DataFrame(j['intervalData'], columns=j['intervalMetaData'])
    

    【讨论】:

    • @shivanshu 这不能解决你的问题吗?
    猜你喜欢
    • 2017-03-21
    • 2020-12-16
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2021-06-12
    • 2022-01-21
    • 2019-05-12
    相关资源
    最近更新 更多