Создание панды DataFrame из SmartSheet API (вложенный, неуклюжий, JSON)

голоса
0

Я пытаюсь подключиться к моему офису SmartSheet API через Python для создания некоторых производительности отслеживания панелей, которые используют за пределы данных SmartSheet. Все, что я хочу сделать, это создать простой DataFrame где поля отражают columnId и значение ячеек отражает ключ displayValue в словаре SmartSheet. Я делаю это с помощью стандартного API requests.get, а не документации API SmartSheet, потому что я нашел последний менее легко работать.

Вот два пути я подошел к этой проблеме:

ВХОД:

from pandas.io.json import json_normalize
dbopj = dbop.json()
dfj_rows = json_normalize(data=dbopj['rows'], record_path='cells', meta=['id', 'rowNumber'])
dfj_rows

ВЫХОД:

DataFrame с columnId, значение, disdlayValue, идентификатор и ROWNUMBER в своих областях.

Если бы я мог понять, как перенести эти данные в правильном направлении, я мог бы заставить его работать, но это кажется невероятно сложным.

ВХОД:

dbopj = dbop.json()
cellist = []
def get_cells():
    dbrows = dbopj['rows']
    for db_cells in dbrows:
        dbcells = db_cells['cells']
        cellist.append(dbcells)
get_cells()
pd.DataFrame(cellist)

ВЫХОД:

Это возвращает DataFrame с правильным числом столбцов и строк, а каждая ячейка заполняется словарь, который выглядит как

{'columnId': 1500325145274244, 'value': 731.0, 'displayValue': '731'}

Если есть способ, чтобы удалить все, кроме значения, соответствующего ключу displayValue в каждой клетке, это, вероятно, решить мою проблему. Опять же, хотя, кажется, причудливо сложно.

Я довольно новый для Python и работаю с API, так что может быть простым способом решения проблемы я с видом. Или, если у вас есть предложение для приближения возможных решений я изложенные выше, я все уши. Спасибо за вашу помощь!

Задан 13/02/2020 в 23:52
источник пользователем
На других языках...                            


1 ответов

голоса
0

Вы должны использовать columnsполе:

colnames = {x['id']: x['title'] for x in samplej['columns']}
columns = [x['title'] for x in samplej['columns']]
cellist = [{colnames[scells['columnId']]: scells['displayValue']
            for scells in s_cells['cells']} for s_cells in samplej['rows']]
celldf = pd.DataFrame(cellist, columns=columns)

Это дает, как и ожидалось:

  Number Letter Name
0      1      A  Joe
1      2      B  Jim
2      3      C  Jon

Если некоторые клетки могут содержать только columnId , но не поле displayValue, scells['displayValue']следует заменить в коде выше с scells.get('displayValue', defaultValue), где defaultValueне может быть ни один, np.nanили любым другим релевантным по умолчанию.

Ответил 14/02/2020 в 17:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more