Pandas嵌套JSON-ID为列名,值作为值

时间:2018-11-12 09:55:55

标签: python-3.x pandas

JSON示例

{
    "tickets": [
        {
            "url": "https://domain.zendesk.com/api/v2/tickets/10001.json",
            "id": 10001,
            "custom_fields": [
                {
                    "id": 360007982393,
                    "value": "Some Value"
                },
                {
                    "id": 360008063134,
                    "value": "Foo"
                },
                {
                    "id": 360007982273,
                    "value": "Bar"
                },
                {
                    "id": 360007982293,
                    "value": null
                }
            ],
            "satisfaction_rating": null
        },
        {
            "url": "https://domain.zendesk.com/api/v2/tickets/10002.json",
            "id": 10002,
            "custom_fields": [
                {
                    "id": 360007982393,
                    "value": "Another value"
                },
                {
                    "id": 360008063134,
                    "value": "Bar"
                },
                {
                    "id": 360007982273,
                    "value": "Foo"
                },
                {
                    "id": 360007982293,
                    "value": null
                }
            ],
            "satisfaction_rating": null
        }
    ],
    "count": 2,
    "next_page": "https://domain.zendesk.com/api/v2/incremental/tickets.json?start_time=1541167467",
    "end_time": 1541167467
}

示例Python

json = << Above JSON >>
tickets_json = json['tickets']
result = json_normalize(data=tickets_json, sep='_')

df=pd.DataFrame(result)

查询描述

因此,通过以上操作,我得到了一个数据框,显示为:

  

URL,ID,custom_fields,满意度等级

Custom_Fields是我需要努力的地方,

  

url,id,custom_fields_360007982393,custom_fields_360008063134,custom_fields_360007982273,custom_fields_360007982293,满意度_p

或与上述类似,因为有效地我需要从自定义值中的ID到主数据框中的列的一部分或成为其名称。

我试图将record_path与meta一起使用,但这会将数据帧转换为无法使用的格式,这对于我在这里想要实现的目的来说。我尝试拉出custom_fields,然后将其附加回去,但是我所能找到的只是将随机数作为列名,然后使用与每个行中的值相同的id,值对。

此数据将导入到MySQL中,并用于根据ID报告值。在大多数情况下,custom_fields的顺序相同,但是我不确定它们会永远保持这种状态。

JSON来自ZenDesk API(https://developer.zendesk.com/rest_api

输出目标:

url, id, 360007982393, 360008063134, 360007982273, 360007982293, satisfaction_rating
"https:.." , 10001, "Some Value", "Foo", "Bar", null, null
"https:.." , 10002, "Another value", "Bar", "Foo", null, null

1 个答案:

答案 0 :(得分:0)

如何为上述json格式编写自定义解析器函数呢? 在脚本下方,该脚本将一张票证转换为将与json_normalize一起使用的“扁平” json:

def parseCustoms(input):
    out = {'url': input['url'],
           'id': input['id'],
           'satisfaction_rating': input['satisfaction_rating']}
    cust_fields = [(str(x['id']),x['value']) for x in input['custom_fields']]
    for field in cust_fields:
        out['cf_' + field[0]] = field[1]
    return out

您将创建解析数组,如

parsed_tickets = [parseCustoms(ticket) for ticket in tickets_json]

现在,json_normalize将表现出预期的效果

result = json_normalize(parsed_tickets)