Pandas JSON
JSON(JavaScript Object Notation, JavaScript Object Notation) — это синтаксис для хранения и обмена текстовой информацией, аналогичный XML.
JSON компактнее, быстрее и проще для анализа, чем XML. Для получения дополнительных сведений о JSON обратитесь круководству по JSON。
Pandas предоставляет мощные методы для обработки данных в формате JSON, поддерживая чтение данных из JSON-файлов или строк и преобразование их в DataFrame, а также преобразование DataFrame обратно в формат JSON.
| Действие | Метод | Описание |
|---|---|---|
| Чтение данных из JSON-файла/строки | pd.read_json() | Чтение и загрузка данных JSON в DataFrame |
| Преобразование DataFrame в JSON | DataFrame.to_json() | Преобразование DataFrame в данные формата JSON, можно указать метод структурирования |
| Поддерживаемые форматы структурирования JSON | orientПараметр | Поддерживает несколько форматов структурирования, таких какsplit、records、columns |
Pandas может очень удобно обрабатывать данные JSON. В этой статье в качестве примера используетсяsites.jsonсо следующим содержимым:
Пример
Загрузка данных из файла/строки JSON
pd.read_json() - Чтение данных JSON
read_json() используется для чтения и загрузки данных в формате JSON в DataFrame. Он поддерживает загрузку данных из файлов JSON, строк JSON или URL-адресов JSON.
Формат синтаксиса:
import pandas as pd
df = pd.read_json(
path_or_buffer, # JSON 文件路径、JSON 字符串或 URL
orient=None, # JSON 数据的结构方式,默认是 'columns'
dtype=None, # 强制指定列的数据类型
convert_axes=True, # 是否转换行列索引
convert_dates=True, # 是否将日期解析为日期类型
keep_default_na=True # 是否保留默认的缺失值标记
)Описание параметра:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
path_or_buffer | Путь к файлу JSON, строка JSON или URL-адрес | Обязательный параметр |
orient | Определяет метод форматирования данных JSON. Распространённые значения:split、records、index、columns、values。 | None(автоматически определяется из файла) |
dtype | Принудительно указать тип данных столбцов | None |
convert_axes | Преобразовывать ли оси в подходящие типы данных | True |
convert_dates | Разбирать ли даты как типы date | True |
keep_default_na | Сохранять ли маркеры пропущенных значений по умолчанию (такие какNaN) | True |
Распространённые варианты параметра orient:
| значение orient | Пример формата JSON | Описание |
|---|---|---|
split | {"index":["a","b"],"columns":["A","B"],"data":[[1,2],[3,4]]} | Использовать ключиindex、columnsиdataСтруктура |
records | [{"A":1,"B":2},{"A":3,"B":4}] | Каждая запись — это словарь, представляющий одну строку данных |
index | {"a":{"A":1,"B":2},"b":{"A":3,"B":4}} | Использует индекс в качестве ключей, а значения — в виде словарей |
columns | {"A":{"a":1,"b":3},"B":{"a":2,"b":4}} | Использует имена столбцов в качестве ключей, а значения — в виде словарей |
values | [[1,2],[3,4]] | Возвращает только данные, исключая индекс и имена столбцов |
Загрузка данных из файла JSON:
Пример
df = pd.read_json('sites.json')
print(df.to_string())
to_string()Используется для возврата данных типа DataFrame. Мы также можем напрямую обрабатывать строки JSON.
Пример
data =[
{
"id": "A001",
"name": "Example",
"url": "www.example.com",
"likes": 61
},
{
"id": "A002",
"name": "Google",
"url": "www.google.com",
"likes": 124
},
{
"id": "A003",
"name": "Taobao",
"url": "www.taobao.com",
"likes": 45
}
]
df = pd.DataFrame(data)
print(df)
Вывод приведенного выше примера:
id name url likes
0 A001 Example www.example.com 61
1 A002 Google www.google.com 124
2 A003 淘宝 www.taobao.com 45
Объекты JSON имеют тот же формат, что и словари Python, поэтому мы можем напрямую преобразовать словарь Python в данные DataFrame:
Пример
# JSON в формате словаря
s = {
"col1":{"row1":1,"row2":2,"row3":3},
"col2":{"row1":"x","row2":"y","row3":"z"}
}
# Чтение JSON и преобразование в DataFrame
df = pd.DataFrame(s)
print(df)
Вывод приведенного выше примера:
col1 col2
row1 1 x
row2 2 y
row3 3 z
Чтение данных JSON из URL:
Пример
URL = '/static.jyshare.com/download/sites.json?v=2'
df = pd.read_json(URL)
print(df)
Вывод приведенного выше примера:
id name url likes
0 A001 Example www.example.com 61
1 A002 Google www.google.com 124
2 A003 淘宝 www.taobao.com 45
Загрузка данных из строки JSON:
Пример
# строка JSON
json_data = '''
[
{"Name": "Alice", "Age": 25, "City": "New York"},
{"Name": "Bob", "Age": 30, "City": "Los Angeles"},
{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''
# Чтение данных из строки JSON
df = pd.read_json(json_data)
print(df)
Вывод:
Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
Чтение данных из JSON (укажите orient как 'records'):
Пример
# Данные JSON
json_data = '''
[
{"Name": "Alice", "Age": 25, "City": "New York"},
{"Name": "Bob", "Age": 30, "City": "Los Angeles"},
{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''
# Чтение данных из строки JSON, укажите orient='records'
df = pd.read_json(json_data, orient='records')
print(df)
Вывод:
Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
Вложенные данные JSON
Предположим, имеется набор вложенных файлов данных JSONnested_list.json :Содержимое файла nested_list.json
"school_name": "ABC primary school",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Том",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "Джеймс",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Дженни",
"math": 79,
"physics": 90,
"chemistry": 78
}]
}
Используйте следующий код, чтобы отформатировать полное содержимое:
Пример
df = pd.read_json('nested_list.json')
print(df)
Вывод приведенного выше примера:
school_name class students
0 ABC primary school Year 1 {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1 ABC primary school Year 1 {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2 ABC primary school Year 1 {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...
На этом этапе нам нужно использовать методjson_normalize(), чтобы полностью разобрать вложенные данные:
Пример
import json
# Загрузить данные с помощью модуля Python JSON
with open('nested_list.json','r') as f:
data = json.loads(f.read())
# Развернуть данные
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)
Вывод приведенного выше примера:
id name math physics chemistry
0 A001 Tom 60 66 61
1 A002 James 89 76 51
2 A003 Jenny 79 90 78
data = json.loads(f.read())Используйте модуль JSON Python для загрузки данных.
json_normalize()Использовали параметрrecord_pathи установили его в['students']чтобы развернуть вложенные данные JSONstudents。
Отображаемый результат не включает элементы school_name и class. Если вам нужно показать их, вы можете использовать параметр meta для отображения этих метаданных:
Пример
import json
# Загрузить данные с помощью модуля Python JSON
with open('nested_list.json','r') as f:
data = json.loads(f.read())
# Развернуть данные
df_nested_list = pd.json_normalize(
data,
record_path =['students'],
meta=['school_name', 'class']
)
print(df_nested_list)
Вывод приведенного выше примера:
id name math physics chemistry school_name class
0 A001 Tom 60 66 61 ABC primary school Year 1
1 A002 James 89 76 51 ABC primary school Year 1
2 A003 Jenny 79 90 78 ABC primary school Year 1
Далее давайте попробуем прочитать более сложные данные JSON, которые содержат вложенные списки и словари. Файл данныхnested_mix.jsonвыглядит следующим образом:
Содержимое файла nested_mix.json
"school_name": "местная начальная школа",
"class": "Year 1",
"info": {
"president": "Джон Кейсик",
"address": "ABC road, Лондон, Великобритания",
"contacts": {
"email": "[email protected]",
"tel": "123456789"
}
},
"students": [
{
"id": "A001",
"name": "Том",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "Джеймс",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Дженни",
"math": 79,
"physics": 90,
"chemistry": 78
}]
}
Преобразуйте файл nested_mix.json в DataFrame:
Пример
import json
# Загрузить данные с помощью модуля Python JSON
with open('nested_mix.json','r') as f:
data = json.loads(f.read())
df = pd.json_normalize(
data,
record_path =['students'],
meta=[
'class',
['info', 'president'],
['info', 'contacts', 'tel']
]
)
print(df)
Вывод приведенного выше примера:
id name math physics chemistry class info.president info.contacts.tel
0 A001 Tom 60 66 61 Year 1 John Kasich 123456789
1 A002 James 89 76 51 Year 1 John Kasich 123456789
2 A003 Jenny 79 90 78 Year 1 John Kasich 123456789
Чтение набора данных из вложенных данных
Ниже приведён пример файлаnested_deep.json, мы читаем только полеmathвложенных данных
Содержимое файла nested_deep.json
"school_name": "местная начальная школа",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Том",
"grade": {
"math": 60,
"physics": 66,
"chemistry": 61
}
},
{
"id": "A002",
"name": "Джеймс",
"grade": {
"math": 89,
"physics": 76,
"chemistry": 51
}
},
{
"id": "A003",
"name": "Дженни",
"grade": {
"math": 79,
"physics": 90,
"chemistry": 78
}
}]
}
Здесь нам нужно использовать модульglomдля обработки вложенности данных,glomЭтот модуль позволяет нам использовать.для доступа к свойствам вложенных объектов.
Перед первым использованием нам нужно установить glom:
pip3 install glom
Пример
from glom import glom
df = pd.read_json('nested_deep.json')
data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)
Вывод приведенного выше примера:
0 60 1 89 2 79 Name: students, dtype: int64
Преобразование DataFrame в JSON
DataFrame.to_json() — преобразование DataFrame в данные JSON
Метод to_json() используется для преобразования DataFrame в данные формата JSON, и вы можете указать способ структурирования JSON.
Формат синтаксиса:
df.to_json(
path_or_buffer=None, # 输出的文件路径或文件对象,如果是 None 则返回 JSON 字符串
orient=None, # JSON 格式方式,支持 'split', 'records', 'index', 'columns', 'values'
date_format=None, # 日期格式,支持 'epoch', 'iso'
default_handler=None, # 自定义非标准类型的处理函数
lines=False, # 是否将每行数据作为一行(适用于 'records' или 'split')
encoding='utf-8' # 编码格式
)Описание параметра:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
path_or_buffer | Путь к выходному файлу или файловый объект; если этоNone, затем возвращает строку JSON | None |
orient | Задаёт структуру формата JSON; поддерживаетsplit、records、index、columns、values | None(по умолчанию —columns) |
date_format | формат даты, поддерживает'epoch'или'iso'format | None |
default_handler | Пользовательская обработка нестандартных типов (таких какdatetimeи т. д.) функция обработки | None |
lines | Выводить ли каждую строку данных как одну строку (применимо кrecordsилиsplit) | False |
encoding | Формат кодировки выходного файла | 'utf-8' |
Пример
# Создать DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['Нью-Йорк', 'Лос-Анджелес', 'Чикаго']
})
# Преобразовать DataFrame в строку JSON
json_str = df.to_json()
print(json_str)
Преобразовать DataFrame в файл JSON (укажите orient='records'):
Пример
# Создать DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['Нью-Йорк', 'Лос-Анджелес', 'Чикаго']
})
# Преобразовать DataFrame в JSON-файл, указать orient='records'
df.to_json('data.json', orient='records', lines=True)
# Вывести содержимое сгенерированного файла:
# [
# {"Name":"Alice","Age":25,"City":"New York"},
# {"Name":"Bob","Age":30,"City":"Los Angeles"},
# {"Name":"Charlie","Age":35,"City":"Chicago"}
# ]
Преобразовать DataFrame в JSON и указать формат даты:
Пример
# Создать DataFrame с данными даты
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Date': pd.to_datetime(['2021-01-01', '2022-02-01', '2023-03-01']),
'Age': [25, 30, 35]
})
# Преобразовать DataFrame в JSON и указать формат даты как 'iso'
json_str = df.to_json(date_format='iso')
print(json_str)
<p>
{"Name":{"0":"Alice","1":"Bob","2":"Charlie"},"Date":{"0":"2021-01-01T00:00:00.000Z","1":"2022-02-01T00:00:00.000Z","2":"2023-03-01T00:00:00.000Z"},"Age":{"0":25,"1":30,"2":35}} Другие расширения