Как преобразовать json в pandas фрейм данных? - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь скрыть ответ api от json до фрейма данных в pandas. проблема, с которой я столкнулся, заключается в том, что данные вложены в формате json, и я не получаю нужные столбцы в моем фрейме данных.

Данные собираются из api в следующем формате:

{'tickets': [{'url': 'https...',
   'id': 1,
   'external_id': None,
   'via': {'channel': 'web',
    'source': {'from': {}, 'to': {}, 'rel': None}},
   'created_at': '2020-05-01T04:16:33Z',
   'updated_at': '2020-05-23T03:02:49Z',
   'type': 'incident',
   'subject': 'Subject',
   'raw_subject': 'Raw subject',
   'description': 'Hi, this is the description',
   'priority': 'normal',
   'status': 'closed',
   'recipient': None,
   'requester_id': 409467360874,
   'submitter_id': 409126461453,
   'assignee_id': 409126461453,
   'organization_id': None,
   'group_id': 360009916453,
   'collaborator_ids': [],
   'follower_ids': [],
   'email_cc_ids': [],
   'forum_topic_id': None,
   'problem_id': None,
   'has_incidents': False,
   'is_public': True,
   'due_at': None,
   'tags': ['tag_1',
    'tag_2',
    'tag_3',
    'tag_4'],
   'custom_fields': [{'id': 360042034433, 'value': 'value of the first custom field'},
    {'id': 360041487874, 'value': 'value of the second custom field'},
    {'id': 360041489414, 'value': 'value of the third custom field'},
    {'id': 360040980053, 'value': 'correo_electrónico'},
    {'id': 360040980373, 'value': 'suscribe_newsletter'},
    {'id': 360042046173, 'value': None},
    {'id': 360041028574, 'value': 'product'},
    {'id': 360042103034, 'value': None}],
   'satisfaction_rating': {'score': 'unoffered'},
   'sharing_agreement_ids': [],
   'comment_count': 2,
   'fields': [{'id': 360042034433, 'value': 'value of the first custom field'},
    {'id': 360041487874, 'value': 'value of the second custom field'},
    {'id': 360041489414, 'value': 'value of the third custom field'},
    {'id': 360040980053, 'value': 'correo_electrónico'},
    {'id': 360040980373, 'value': 'suscribe_newsletter'},
    {'id': 360042046173, 'value': None},
    {'id': 360041028574, 'value': 'product'},
    {'id': 360042103034, 'value': None}],
   'followup_ids': [],
   'ticket_form_id': 360003608013,
   'deleted_ticket_form_id': 360003608013,
   'brand_id': 360004571673,
   'satisfaction_probability': None,
   'allow_channelback': False,
   'allow_attachments': True},

Я уже пробовал следующее: я преобразовал формат JSON в dict следующим образом:

x = response.json()
df = pd.DataFrame(x['tickets'])

Но у меня проблемы с выводом. Я не знаю, как получить правильный, упорядоченный, нормализованный фрейм данных.

(я новичок в этом :))

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Вы должны сначала преобразовать json в словарь, а затем преобразовать значение словаря для ключа «билеты» в фрейм данных.

file = open('file.json').read()
ticketDictionary = json.loads(file)
df = pd.DataFrame(ticketDictionary['tickets'])

'file.json' содержит ваши данные здесь.

df теперь содержит ваш dataFrame в этом формате. df

Для списков в ответе вы можете иметь отдельные фреймы данных, если требуется:

for field in df['fields']:
        df = pd.DataFrame(field)

Это даст вам это для длин:

            id                             value
0  360042034433   value of the first custom field
1  360041487874  value of the second custom field
2  360041489414   value of the third custom field
3  360040980053                correo_electrónico
4  360040980373               suscribe_newsletter
5  360042046173                              None
6  360041028574                           product
7  360042103034                              None

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

0 голосов
/ 10 июля 2020

Предположим, вы получаете данные своего запроса по этому коду r = requests.get(url, auth)

Ваши данные еще не очищены, поэтому давайте получим их фрейм данных data = pd.read_json(json.dumps(r.json, ensure_ascii = False))

Но, возможно, вы получит фрейм данных с одной строкой.

Когда я столкнулся с такой проблемой, я написал эту функцию для получения полных данных:

listParam = []

def listDict(entry):
    if type(entry) is dict:
        listParam.append(entry)
    elif type(entry) is list:
        for ent in entry:
            listDict(ent)

Потому что ваши данные выглядят как dict, потому что of {'Tickets': ...} вам нужно будет получить такую ​​информацию:

listDict(data.iloc[0][0])

И затем

pd.DataFrame(listParam)

Я не могу показать результаты, потому что вы не опубликовал полные данные и не сказал, где я могу найти данные для тестирования, но это, вероятно, сработает.

...