# Конвертация Pandas DataFrame в JSON

В этом руководстве **вы научитесь преобразовывать объект DataFrame Pandas в объект JSON и файл с использованием Python.** Большинство языков программирования умеют читать, анализировать и работать с JSON. Из-за этого умение преобразовывать объект DataFrame Pandas в JSON является важным навыком.

Pandas обеспечивает большую гибкость при преобразовании DataFrame в файл JSON. Это руководство погружает в функциональные возможности с практическими примерами. К концу этого учебного пособия вы узнаете:

* Как преобразовать DataFrame Pandas в строку или файл JSON
* Как настроить форматы для отсутствующих данных и чисел с плавающей запятой
* Как настроить структуру полученного файла JSON
* Как сжать файл JSON при преобразовании DataFrame Pandas

Оглавление

* [Понимание метода Pandas to\_json](#ponimanie-metoda-pandas-to_json)
* [Загрузка образца DataFrame Pandas](#zagruzka-obrazca-dataframe-pandas)
* [Преобразование DataFrame Pandas в строку JSON](#preobrazovanie-dataframe-pandas-v-stroku-json)
* [Преобразование DataFrame Pandas в файл JSON](#preobrazovanie-dataframe-pandas-v-fail-json)
* [Настройка структуры JSON таблицы данных Pandas](#nastroika-struktury-json-tablicy-dannykh-pandas)
  * [Pandas DataFrame в JSON: разделенная структура](#pandas-dataframe-v-json-razdelennaya-struktura)
  * [Pandas DataFrame в JSON: структура индекса](#pandas-dataframe-v-json-struktura-indeksa)
  * [Pandas DataFrame в JSON: структура столбцов](#pandas-dataframe-v-json-struktura-stolbcov)
  * [Pandas DataFrame в JSON: структура значений](#pandas-dataframe-v-json-struktura-znachenii)
  * [Pandas DataFrame в JSON: структура таблицы](#pandas-dataframe-v-json-struktura-tablicy)
* [Изменение значений с плавающей запятой при преобразовании фреймов данных Pandas в JSON](#izmenenie-znachenii-s-plavayushei-zapyatoi-pri-preobrazovanii-freimov-dannykh-pandas-v-json)
* [Преобразование фреймов данных Pandas в JSON и включение индекса](#preobrazovanie-freimov-dannykh-pandas-v-json-i-vklyuchenie-indeksa)
* [Как сжимать файлы при преобразовании фреймов данных Pandas в JSON](#kak-szhimat-faily-pri-preobrazovanii-freimov-dannykh-pandas-v-json)
* [Как изменить отступ файла JSON при преобразовании фрейма данных Pandas](#kak-izmenit-otstup-faila-json-pri-preobrazovanii-freima-dannykh-pandas)
* [Часто задаваемые вопросы](#chasto-zadavaemye-voprosy)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

### Понимание метода Pandas to\_json

Чтобы преобразовать DataFrame Pandas в строку JSON или файл, вы можете использовать метод `.to_json()`. Давайте начнем с изучения метода и какие параметры в нем доступны. Метод предоставляет большую гибкость в том, как структурировать файл JSON.

```python
# Understanding the Pandas .to_json() Method
import pandas as pd
df = pd.DataFrame()
df.to_json(path_or_buf=None, orient=None, date_format=None, double_precision=10, force_ascii=True, date_unit='ms', default_handler=None, lines=False, compression='infer', index=True, indent=None, storage_options=None)
```

Как видно из приведенного выше блока кода, метод имеет большое количество параметров. Фактически, метод предоставляет значения по умолчанию для всех параметров, что означает, что вы можете вызвать метод без необходимости дополнительных инструкций.

Таблица разбивает аргументы и их аргументы по умолчанию для метода `.to_json()`:

| Параметр            | Описание                                                                                    | Аргумент по умолчанию | Принятые значения            |
| ------------------- | ------------------------------------------------------------------------------------------- | --------------------- | ---------------------------- |
| `path_or_buf=`      | Объект строки или пути для записи JSON. Если `None`, результат возвращается в виде строки.  | `None`                | string, path object, or None |
| `orient=`           | Как отформатировать строку JSON.                                                            | `None`                | string                       |
| `date_format=`      | Тип преобразования даты.                                                                    | `None`                | None, epoch, iso             |
| `double_precision=` | Количество десятичных знаков, используемых при кодировании значений с плавающей запятой..   | `10`                  | int                          |
| `force_ascii=`      | Необходимо ли принудительно закодировать строки в ASCII.                                    | `True`                | Bool                         |
| `date_unit=`        | Единица времени для кодирования.                                                            | `'ms'`                | string                       |
| `default_handler=`  | Обработчик для вызова, если иначе объект нельзя преобразовать в подходящий формат для JSON. | `None`                | callable                     |
| `lines=`            | Следует ли записывать JSON с разделителями строк.                                           | `False`               | Bool                         |
| `compression=`      | Для оперативного сжатия выходных данных.                                                    | `'infer'`             | string or dict               |
| `index=`            | Включать ли значения индекса в строку JSON.                                                 | `True`                | Bool                         |
| `indent=`           | Длина пробела, используемого для отступа каждой записи.                                     | `None`                | Integer                      |
| `storage_options=`  | Дополнительные возможности для различных вариантов хранения, таких как хранилище S3.        | `None`                | dict                         |

Теперь, когда у вас есть твердое понимание метода, давайте загрузим образец Pandas DataFrame, чтобы продолжить работать вместе.

### Загрузка образца DataFrame Pandas

Давайте начнем с загрузки примера DataFrame Pandas, который вы можете использовать, чтобы следовать вместе с нами. Данные будут сознательно простыми, чтобы упростить следование инструкциям. Просто скопируйте и вставьте приведенный ниже код в выбранный вами редактор кода:

```python
# Loading a Sample Pandas DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame({
    'Name': ['Nik', 'Kate', 'Isla'],
    'Age': [33, np.NaN, 37],
    'Sales': [33.33, 56.32, 43.44444]
})

print(df)

# Returns:
#    Name   Age     Sales
# 0   Nik  33.0  33.33000
# 1  Kate   NaN  56.32000
# 2  Isla  37.0  43.44444
```

У нас есть DataFrame, который содержит 3 столбца с 3 записями. Один из столбцов содержит строки, другой содержит целые числа и пропущенные значения, а третий содержит значения с плавающей точкой. Теперь, когда у нас есть загруженный DataFrame, давайте начнем с конвертации DataFrame в строку JSON.

### Преобразование DataFrame Pandas в строку JSON

Метод `.to_json()` в Pandas содержит аргументы по умолчанию для всех параметров. Это означает, что мы можем вызвать метод, не передавая никаких спецификаций. По умолчанию Pandas будет использовать аргумент `path_or_buf=None`, что указывает на то, что DataFrame должен быть преобразован в строку JSON.

Давайте посмотрим, как мы можем преобразовать наш DataFrame Pandas в строку JSON:

```python
# Convert a Pandas DataFrame to a JSON String
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

json_string = df.to_json()
print(json_string)

# Returns:
# {"Name":{"0":"Nik","1":"Kate","2":"Isla"},"Age":{"0":33.0,"1":null,"2":37.0},"Sales":{"0":33.33,"1":56.32,"2":43.44444}}
```

Мы видим, что передача метода `.to_dict()` с аргументами по умолчанию к объекту Pandas DataFrame возвращает строковое представление файла JSON.

Вы, конечно, можете сериализовать эту строку в словарь Python. Однако, если вы хотите преобразовать DataFrame Pandas в словарь, вы также можете просто использовать Pandas для [преобразования DataFrame в словарь](preobrazovanie-dataframe-pandas-v-fail-pickle)

### Преобразование DataFrame Pandas в файл JSON

Чтобы преобразовать DataFrame Pandas в файл JSON, вы можете передать объект пути или объект, подобный файлу, методу Pandas `.to_json()`. Передавая строку, представляющую [путь к файлу JSON](https://datagy.io/python-get-file-name-from-path/), в вызов нашего метода, создается файл, содержащий наш DataFrame.

Давайте посмотрим, как это выглядит:

```python
# Creating a JSON File with Our Pandas DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

df.to_json('dataframe.json')
```

В следующем разделе вы узнаете, как настроить структуру нашего JSON файла.

### Настройка структуры JSON таблицы данных Pandas

Метод `.to_json()` в библиотеке Pandas предоставляет огромную гибкость в структурировании результирующего JSON файла. По умолчанию файл JSON будет структурирован как `'columns'`. Метод предоставляет следующие опции: `'split', 'records', 'index', 'columns', 'values', 'table'`. Давайте исследуем эти опции, чтобы разобраться в различных возможностях.

#### Pandas DataFrame в JSON: разделенная структура

By passing `'split'` into the Pandas `.to_json()` method’s orient argument, you return JSON string that formats the data in the format of a dictionary that breaks out the index, columns, and data separately. This is demonstrated below and can be helpful when moving data into a database format:

```
# Using the 'split' orientation
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(orient='split'))

# Returns:
# {"columns":["Name","Age","Sales"],"index":[0,1,2],"data":[["Nik",33.0,33.33],["Kate",null,56.32],["Isla",37.0,43.44444]]}
```

#### Pandas DataFrame to JSON: Records Structure

При передаче значения `'records'` в аргумент orient метода `.to_json()` библиотеки Pandas, вы получите строку в формате JSON, которая структурирует данные в виде списка словарей, где ключи - это названия столбцов, а значения - записи для каждой отдельной записи.

```python
# Using the 'records' orientation
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(orient='records'))

# Returns:
# [{"Name":"Nik","Age":33.0,"Sales":33.33},{"Name":"Kate","Age":null,"Sales":56.32},{"Name":"Isla","Age":37.0,"Sales":43.44444}]
```

#### Pandas DataFrame в JSON: структура индекса

При передаче `'index'` в аргумент orient метода `.to_json()` библиотеки Pandas, вы получаете строку в формате JSON, которая организует данные в виде словаря, содержащего индексы в качестве ключей и словари сопоставлений столбцов с записями.

```python
# Using the 'index' orientation
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(orient='index'))

# Returns:
# {"0":{"Name":"Nik","Age":33.0,"Sales":33.33},"1":{"Name":"Kate","Age":null,"Sales":56.32},"2":{"Name":"Isla","Age":37.0,"Sales":43.44444}}
```

#### Pandas DataFrame в JSON: структура столбцов

Используя аргумент orient метода `.to_json()` в Pandas со значением `'columns'`, вы получаете строку в формате JSON, которая представляет данные в виде словаря. В этом словаре колонки выступают в роли ключей, а значениями являются словари сопоставления индекса с записью.

```python
# Using the 'columns' orientation
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(orient='columns'))

# Returns:
# {"Name":{"0":"Nik","1":"Kate","2":"Isla"},"Age":{"0":33.0,"1":null,"2":37.0},"Sales":{"0":33.33,"1":56.32,"2":43.44444}}
```

#### Pandas DataFrame в JSON: структура значений

При передаче `'values'` в аргумент orient метода `.to_json()` библиотеки Pandas, вы получаете строку в формате JSON, которая форматирует данные только с их значениями.

```python
# Using the 'values' orientation
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(orient='values'))

# Returns:
# [["Nik",33.0,33.33],["Kate",null,56.32],["Isla",37.0,43.44444]]
```

#### Pandas DataFrame в JSON: структура таблицы

При передаче `'table'` в аргумент orient метода `.to_json()` библиотеки Pandas, возвращается строка JSON, которая форматирует данные в виде схематической таблицы.

```python
# Using the 'table' orientation
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(orient='table'))

# Returns:
# '{"schema":{"fields":[{"name":"index","type":"integer"},{"name":"Name","type":"string"},{"name":"Age","type":"number"},{"name":"Sales","type":"number"}],"primaryKey":["index"],"pandas_version":"1.4.0"},"data":[{"index":0,"Name":"Nik","Age":33.0,"Sales":33.33},{"index":1,"Name":"Kate","Age":null,"Sales":56.32},{"index":2,"Name":"Isla","Age":37.0,"Sales":43.44444}]}'
```

### Изменение значений с плавающей запятой при преобразовании фреймов данных Pandas в JSON

По умолчанию Pandas сокращает точность чисел с плавающей запятой до 10 десятичных знаков. Мы можем настроить это поведение, изменив параметр `double_precision=` метода `to_json()`&#x20;

Одно из значений в нашем DataFrame содержит значение с плавающей точкой с точностью до пяти знаков. Давайте изменим поведение так, чтобы оно включало только один знак после запятой.

```python
# Modifying Floating Point Precision Values
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(double_precision=1))

# Returns:
# {"Name":{"0":"Nik","1":"Kate","2":"Isla"},"Age":{"0":33.0,"1":null,"2":37.0},"Sales":{"0":33.3,"1":56.3,"2":43.4}}
```

В следующем разделе вы узнаете, как преобразовать DataFrame в JSON и включить индекс.

### Преобразование фреймов данных Pandas в JSON и включение индекса

По умолчанию Pandas будет включать индекс при преобразовании DataFrame в объект JSON. Мы можем изменить это поведение, используя параметр `index=`. Этот параметр можно изменить только при ориентировании вашего DataFrame как `'split'` или `'table'`.

Давайте посмотрим, как это выглядит, когда мы удаляем индекс при конвертации в JSON: удалить индекс

```python
# Dropping an Index When Converting a DataFrame to JSON
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(orient='split', index=False))

# Returns:
# {"columns":["Name","Age","Sales"],"data":[["Nik",33.0,33.33],["Kate",null,56.32],["Isla",37.0,43.44444]]}
```

В следующем разделе вы узнаете, как указать сжатие для вашего результирующего JSON файла.

### Как сжимать файлы при преобразовании фреймов данных Pandas в JSON

Метод `.to_json()` в Pandas предлагает значительную настраиваемость в способах сжатия вашего JSON файла. По умолчанию, Pandas попытается определить, какое сжатие использовать, основываясь на расширении файла, которое было предоставлено.

Pandas в настоящее время поддерживает сжатие файлов с использованием форматов zip, gzip, bz2, zstd и tar. Давайте посмотрим, как мы можем сжать наш DataFrame в формат zip сжатия:

```python
# Compressing Your JSON File When Converting a DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

df.to_json('DataFrame.json', compression='zip')
```

В следующем разделе вы научитесь изменять отступ в вашем JSON-файле. Когда вы захотите прочитать ваш JSON-файл как DataFrame, вам нужно будет указать, какой тип сжатия использовался.

### Как изменить отступ файла JSON при преобразовании фрейма данных Pandas

Pandas также позволяет указать отступ при печати вашего результирующего JSON-файла. Это похоже на красивую печать JSON в Python, используя параметр `indent=`, вы можете указать целое число, представляющее количество отступов, которое вы хотите предоставить.

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

```python
# Specifying the Indent of a JSON File When Converting a Pandas DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name': ['Nik', 'Kate', 'Isla'], 'Age': [33, np.NaN, 37], 'Sales': [33.33, 56.32, 43.44444]})

print(df.to_json(indent=4))

# Returns:
# {
#     "Name":{
#         "0":"Nik",
#         "1":"Kate",
#         "2":"Isla"
#     },
#     "Age":{
#         "0":33.0,
#         "1":null,
#         "2":37.0
#     },
#     "Sales":{
#         "0":33.33,
#         "1":56.32,
#         "2":43.44444
#     }
# }
```

### Часто задаваемые вопросы

<details>

<summary>Как записать DataFrame Pandas в файл JSON?</summary>

Метод to\_json() в библиотеке Pandas позволяет конвертировать DataFrame Pandas в строку или файл JSON. Этот метод предоставляет настройки для того, как записи должны быть структурированы, сжаты и представлены.

</details>

<details>

<summary>Что такое параметр ориентации в Pandas to_json?</summary>

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

</details>

### Заключение

В этом учебном пособии вы научились конвертировать DataFrame Pandas в строку или файл JSON. Сначала вы узнали о методе `.to_dict()` Pandas, его различных параметрах и аргументах по умолчанию. Затем вы научились конвертировать DataFrame в строку и файл JSON. После этого вы узнали, как настроить вывод, указав ориентацию файла JSON. Вы также научились настраивать значения с плавающей точкой, индекс и отступ объекта.

### Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с обучающими материалами ниже:

* Преобразование фрейма данных Pandas в словарь
* Преобразование фрейма данных Pandas в список
* Преобразование списка словарей в фрейм данных Pandas
* Преобразование DataFrame Pandas в массив NumPy
* Преобразование фрейма данных Pandas в файл Pickle
* Pandas: создайте фрейм данных из списков (5 способов!)
