Пытаетесь свести 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 и была опубликована здесь с разрешения.