Пытаетесь свести JSON в удобный для человека формат? Являются ли ваши данные JSON вложенными? В любом случае, библиотека Pandas может быстро преобразовать этот общий формат данных в более удобное для чтения представление, когда это необходимо!
Табулирование данных — это процесс, в котором различные сегменты выравниваются в вертикальных столбцах и горизонтальных рядах. Это распространенный формат представления таких вещей, как таблицы, электронные таблицы, календари и бизнес-отчеты. Табулирование данных JSON в Python может быть простым, если использовать объект Pandas DataFrame для выполнения тяжелой работы.
Нотация объектов JavaScript (JSON) — это стандартизированный формат данных, распространенный среди веб-языков, API передачи репрезентативного состояния (REST) и обмена сообщениями данных между приложениями. На практике возможность табулирования JSON зависит от структуры данных. В этой статье мы рассмотрим, как быстро составить таблицу JSON в Python с помощью Pandas, а также некоторые случаи, когда результаты могут быть плохими.
Настройка: образец данных JSON
Прежде чем мы начнем табулировать данные в формате JSON, давайте сначала создадим некоторые образцы данных. Мы создадим записи о 25 случайных сотрудниках, используя create_random_people_data
функцию, доступную через Github. Затем мы сохраним эти данные в локальный файл с именем sample.json
с помощью следующего кода:
import json # Generate data for 25 people people = create_random_people_data(25) # Write the output date as a json-formatted file with open("sample-data.json", 'w')as file: file.write(json.dumps(people))
Это сохраняет файл со следующими данными (некоторые записи удалены для краткости):
[ { "id": 1, "first_name": "Mary", "last_name": "Smith", "location": { "City": "New York", "State": "New York" }, "age": 32 }, ... { "id": 25, "first_name": "Pat", "last_name": "Smith", "location": { "City": "Denver", "State": "Colorado" }, "age": 32 } ]
Табулировать данные JSON
Чтобы свести в таблицу наши данные JSON, мы будем использовать библиотеку Pandas и использовать объект DataFrame. Чтобы приблизиться к этому, метод from_dict
можно использовать в сочетании с методом json.load
как таковым:
import pandas as pd import json # open file with open('sample.json', 'r')as file: df = pd.DataFrame.from_dict(json.load(file)) # print first 5 records via head() method print(df.head()) id first_name last_name location age 0 1 Mary Smith {'City': 'New York', 'State': 'New York'} 32 1 2 John Jones {'City': 'Los Angeles', 'State': 'California'} 18 2 3 Pat Smith {'City': 'Denver', 'State': 'Colorado'} 32 3 4 John Jones {'City': 'Los Angeles', 'State': 'California'} 42 4 5 Mary Jacobs {'City': 'Denver', 'State': 'Colorado'} 42
Это хорошее начало, однако есть некоторые проблемы. Поле id
, вероятно, следует использовать для индексации наших данных — это незначительная проблема. Более проблематичная проблема заключается в том, что наши данные о местоположении по-прежнему отображаются в исходном формате, теперь отражающем формат Python dict
(из-за анализа с помощью json.load
). Чтобы решить эти проблемы, мы будем использовать методы normalize_json
и set_index
DataFrame как таковые:
import pandas as pd import json # open file with open('sample.json', 'r')as file: # load as dataframe using json_normalize method df = pd.json_normalize(json.load(file)) # set the index to employee id df.set_index(['id'], inplace=True) # print first 5 records print(df.head()) # output first_name last_name age location.City location.State id 1 Mary Smith 32 New York New York 2 John Jones 18 Los Angeles California 3 Pat Smith 32 Denver Colorado 4 John Jones 42 Los Angeles California 5 Mary Jacobs 42 Denver Colorado
Обратите внимание, что Pandas позволяет нам точно читать вложенные данные JSON, создавая соответствующие имена столбцов location.City
и location.State
, где это необходимо.
Примечание. Всегда рекомендуется проверять пропущенные значения в Pandas перед более глубоким анализом. Прочтите эту статью, чтобы получить некоторые советы по работе с отсутствующими данными.
Парсинг списков в JSON
Интересный случай разбора JSON с помощью Pandas, особенно когда приоритет отдается табличным представлениям, — это списки. Представьте, что в приведенных выше данных есть запись для hobbies
как таковая:
{ "id": 2, "first_name": "Pat", "last_name": "Williams", "location": { "City": "New York", "State": "New York" }, "age": 55, "hobbies": [ "singing", "painting", "programming", "fishing" ] }
Здесь мы видим формат списка для данных в поле hobbies
. Если мы проанализируем эти данные с помощью функции pd.normalize_json
, как и раньше, мы получим следующий результат:
first_name last_name age hobbies \ id 1 John Jacobs 60 [singing] 2 Pat Williams 55 [singing, painting, programming, fishing] 3 Mary Jacobs 18 [singing] 4 Alice Jones 24 [singing, painting, fishing, dancing, running] 5 Pat Anderson 24 [programming, fishing, singing]
Здесь мы видим отформатированную строку наших данных в формате списка для поля hobbies
для каждого случайного человека. На первый взгляд может показаться, что это ошибка синтаксического анализа. Однако это не так, а просто то, как список значений будет представлен в формате столбца.
Примечание. последние два столбца location.City
и location.State
здесь удалены для краткости.
Эти проблемы, вероятно, необходимо будет решать в каждом конкретном случае, когда Pandas инструктируют, как отображать такие данные. Например, было бы идеально иметь столбцы hobby_1
, hobby_2
, hobby_3
, hobby_4
и hobby_5
? Что, если бы кто-то перечислил более 5 увлечений? Вы бы ограничили количество увлечений, которые человек может перечислить? Вы бы просто проигнорировали любые увлечения, перечисленные выше 5?
Обобщенный подход к форматированию данных списка состоит в том, чтобы удалить скобки и просто преобразовать данные в формат CSV как таковые:
# map a function to join all list items via a single ',' character df = df.applymap(lambda x: ",".join(x) if type(x) is list else x)
Это преобразует столбец hobbies
в следующий формат:
first_name last_name age hobbies \ id 1 John Jacobs 60 singing 2 Pat Williams 55 singing,painting,programming,fishing 3 Mary Jacobs 18 singing 4 Alice Jones 24 singing,painting,fishing,dancing,running 5 Pat Anderson 24 programming,fishing,singing
Будет ли это идеальный формат, будет решать разработчик. Лично я считаю, что удаление скобок позволило бы более гибко использовать другие табличные форматы — например, в случае, когда DataFrame был экспортирован как файл в формате CSV. Кроме того, назначение квадратных скобок может быть не очень хорошо известно людям, не являющимся программистами, в тех случаях, когда данные предназначены для экспорта и использования более общими потребителями, такими как бизнес-аналитики.
Последние мысли
Табулировать JSON в Python несложно, если использовать возможности Pandas. Метод normalize_json
помогает гарантировать, что синтаксический анализ вложенного JSON приводит к соответствующим именам столбцов, посредством чего вложенные ключи преобразуются в имена столбцов с точечной адресацией.
Обработка определенных данных, таких как списки, может внести жесткость в подход, который используется при анализе вложенного JSON. Таким образом, во многих случаях синтаксического анализа вложенных JSON в табличные форматы потребуется процесс проверки данных, за которым следуют предпочтительные индивидуальные подходы. Такова жизнь программиста!
Статья Табулирование данных JSON в Python с помощью Pandas впервые появилась на веб-сайте alpharithms и была опубликована здесь с разрешения.