Нормализовать Monday.com Вывод API JSON в Python

#python #json #pandas #monday.com

Вопрос:

В конечном счете, я пытаюсь сгенерировать csv-файл из выходных данных JSON Monday.com Запрос API.

Ниже приведен мой код до сих пор. У меня возникли проблемы с попыткой превратить JSON в таблицу.

 import requests
import json
import pandas as pd

apiKey = "API Key Here"
apiUrl = "https://api.monday.com/v2"
headers = {"Authorization" : apiKey}

query2 = '{boards(ids:123456) {items{name, column_values{title text } } } }'
data = {'query' : query2}

json_data = json.loads(requests.post(url=apiUrl, json=data, headers=headers).text)

norm=pd.json_normalize(json_data, 'items',['data', 'boards'])
 

Вывод JSON из API. Я добавил несколько лайнбреков для удобства чтения человеком.

 {'data':
  {'boards':
  [{'items':
  [{'name': 'Item 1', 'column_values': [{'title': 'Person', 'text': 'Mark McCoy'}, {'title': 'Status', 'text': None}, {'title': 'Date', 'text': '2021-02-05'}]},
  {'name': 'This is a new item', 'column_values': [{'title': 'Person', 'text': ''}, {'title': 'Status', 'text': None}, {'title': 'Date', 'text': '2021-04-17'}]},
  {'name': 'Item 5', 'column_values': [{'title': 'Person', 'text': ''}, {'title': 'Status', 'text': None}, {'title': 'Date', 'text': '2021-02-13'}]},
  {'name': 'Item 2', 'column_values': [{'title': 'Person', 'text': ''}, {'title': 'Status', 'text': 'Done'}, {'title': 'Date', 'text': '2021-05-14'}]}]}]},
  'account_id': 00000000}
 

Когда я запускаю файл ,py в терминале, я получаю вывод ниже

 Traceback (most recent call last):
  File "/Users/markamccoy/Desktop/MondayPy/stack.py", line 14, in <module>
    norm=pd.json_normalize(json_data, 'items',['data', 'boards'])
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 336, in _json_normalize
    _recursive_extract(data, record_path, {}, level=0)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 309, in _recursive_extract
    recs = _pull_records(obj, path[0])
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 248, in _pull_records
    result = _pull_field(js, spec)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 239, in _pull_field
    result = result[spec]
KeyError: 'items'
 

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

Ответ №1:

Если вы используете нормализацию.результат будет выглядеть так.

 df = pd.json_normalize(json_data['data']['boards'][0]['items'],record_path='column_values',meta=['name'])
 
     title   text        name
0   Person  Mark McCoy  Item 1
1   Status  None        Item 1
2   Date    2021-02-05  Item 1
3   Person              This is a new item
4   Status  None        This is a new item
5   Date    2021-04-17  This is a new item
 

Но я думаю, что это не то, что вы хотите.и нет примера, чтобы сгладить такие массивы в json_normalize.

 data = [ [item['name']] [c_v['text'] for c_v in item['column_values']] for item in json_data['data']['boards'][0]['items']]
df = pd.DataFrame(data,columns=['name','Person','Status','Date'])
 
 name    Person              Status  Date
0       Item 1  Mark McCoy  None    2021-02-05
1       This is a new item  None    2021-04-17
2       Item 5              None    2021-02-13
3       Item 2              Done    2021-05-14
 

так что я могу сделать это только на python.
если у вас есть еще один вопрос.пожалуйста, прокомментируйте мне