Вложенный JSON Pandas - идентификатор в качестве имени столбца, значение в качестве значения - PullRequest
0 голосов
/ 12 ноября 2018

Пример 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 - вот где я борюсь, так как мне нужно получить:

url, id, custom_fields_360007982393, custom_fields_360008063134, custom_fields_360007982273, custom_fields_360007982293, рейтинг удовлетворенности

Или аналогично приведенному выше, поскольку для эффективного использования мне нужны идентификаторы из пользовательских значений, чтобы разделить или стать именами столбцов в основном фрейме данных.

Я пытался использовать record_path с мета, но это переворачивает фрейм данных в непригодный формат для того, чего я пытаюсь достичь здесь. Я попытался вытащить custom_fields и затем добавить его обратно, но все, что я смог найти, это просто указать случайное число в качестве имени столбца, а затем просто иметь тот же идентификатор, пару значений в качестве значения в каждой строке.

Эти данные будут импортированы в MySQL и использованы для отчета о значениях по идентификатору. По большей части custom_fields находятся в том же порядке, однако я не могу быть уверен, что они останутся такими навсегда.

JSON происходит от API ZenDesk (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 голосов
/ 12 ноября 2018

Как насчет написания пользовательской функции парсера для вышеуказанного формата json?Ниже сценария, который преобразует один тикет в «плоский» json, который будет работать с json_normalize:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...