Я пытаюсь заполнить pandas DataFrame выбранной информацией из вывода JSON, полученного из API.

candidate_list = []

for candidate in candidate_response['data']:
    if 'error' not in candidate_response:
       candidate_list.append([candidate['id'], candidate['attributes']['first_name'], candidate['attributes']
       ['last_name'], candidate['relationships']['educations']['data']['id']])

DataFrame заполняется нормально, пока я не добавлю candidate['relationships']['educations']['data']['id'], который выбрасывает TypeError: list indices must be integers or slices, not str.

При попытке получить значения индексов для ['id'], используя вместо этого candidate['relationships']['educations']['data'][0]['id'], я получаю IndexError: list index out of range.

Вывод JSON выглядит примерно так:

"data": [
    {
        "attributes": {
            "first_name": "Tester",
            "last_name": "Testman",
            "other stuff": "stuff",
        },
        "id": "732887",
        "relationships": {
            "educations": {
                "data": [
                    {
                        "id": "605372",
                        "type": "educations"
                    },
                    {
                        "id": "605371",
                        "type": "educations"
                    },
                    {
                        "id": "605370",
                        "type": "educations"
                    }
                ]
            }
        },

Как мне успешно заполнить столбец в DataFrame идентификаторами «id в« отношениях »>« образование »>« данные »?

0
guarrana 12 Янв 2021 в 18:31

3 ответа

Лучший ответ

Обратите внимание, что при использовании candidate['relationships']['educations']['data']['id'] вы получаете эту ошибку, потому что в data находится список, а не словарь. И вы не можете получить доступ к словарю по имени.

Предполагая, что вы пытаетесь достичь одной записи на запись data.attributes.relationships.educations.data. Полный код, который работает и делает то, что вы пытаетесь:

import json

json_string = """{
    "data": [
        {
            "attributes": {
                "first_name": "Tester",
                "last_name": "Testman",
                "other stuff": "stuff"
            },
            "id": "732887",
            "relationships": {
                "educations": {
                    "data": [
                        {
                            "id": "605372",
                            "type": "educations"
                        },
                        {
                            "id": "605371",
                            "type": "educations"
                        },
                        {
                            "id": "605370",
                            "type": "educations"
                        }
                    ]
                }
            }
        }
    ]
}"""

candidate_response = json.loads(json_string)

candidate_list = []

for candidate in candidate_response['data']:
    if 'error' not in candidate_response:
        for data in candidate['relationships']['educations']['data']:
            candidate_list.append(
                [
                    candidate['id'], 
                    candidate['attributes']['first_name'], 
                    candidate['attributes']['last_name'], 
                    data['id']
                ]
            )

print(candidate_list)

Выполнение кода доступно по адресу ideone.

1
Tomer Shetah 18 Янв 2021 в 18:52

Вероятно, для любого кандидата-кандидата ['отношения'] ['образование'] ['данные'] - это пустой список

0
Pablo Henkowski 16 Янв 2021 в 00:13

Я проанализировал ваш код, а также запустил его на ноутбуке Jupyter, все выглядит хорошо, я получаю результат, Вы получили ошибку list indices must be integers or slices, not str, потому что вы не использовали индекс, это необходимо, потому что значение, которое вы ищете, находится в списке.

И об этой ошибке: IndexError: list index out of range. Возможно, с вашей стороны допущена какая-то опечатка в коде, иначе код в порядке.

Вот результат вашего следующего кода:

candidate_list = []

for candidate in candidate_response['data']:
    if 'error' not in candidate_response:
        candidate_list.append([candidate['id'], candidate['attributes']['first_name'], candidate['attributes']['last_name'],candidate['relationships']['educations']['data'][0]['id']])

Вывод

enter image description here

0
The Guy 12 Янв 2021 в 17:45