Pandas JSON
JSON(JavaScript Object Notation、JavaScriptオブジェクト表記法)は、テキスト情報を保存および交換するための構文であり、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文字列、JSONのURLからデータを読み込むことができます。
構文形式:
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 | 日付を日付型として解析するかどうか | 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}] | 各レコードは辞書であり、1行のデータを表します。 |
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": "サンプル",
"url": "www.example.com",
"likes": 61
},
{
"id": "A002",
"name": "Google",
"url": "www.google.com",
"likes": 124
},
{
"id": "A003",
"name": "淘宝",
"url": "www.taobao.com",
"likes": 45
}
]
df = pd.DataFrame(data)
print(df)
上記の例の出力結果は次の通りです:
id name url likes
0 A001 サンプル 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
URLからJSONデータを読み取る:
例
URL = '/static.jyshare.com/download/sites.json?v=2'
df = pd.read_json(URL)
print(df)
上記の例の出力結果は次の通りです:
id name url likes
0 A001 サンプル 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データ
ネストされたJSONデータのファイル群があるとします。nested_list.json :nested_list.json ファイルの内容
"school_name": "ABC primary school",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Tom",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "James",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Jenny",
"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())PythonのJSONモジュールを使用してデータを読み込みます。
json_normalize()パラメータを使用し、record_pathそして次のように設定します:['students']ネストされたJSONデータを展開するために使用します。students。
表示結果にはまだ 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": "local primary school",
"class": "Year 1",
"info": {
"president": "John Kasich",
"address": "ABC road, London, UK",
"contacts": {
"email": "[email protected]",
"tel": "123456789"
}
},
"students": [
{
"id": "A001",
"name": "Tom",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "James",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Jenny",
"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": "local primary school",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Tom",
"grade": {
"math": 60,
"physics": 66,
"chemistry": 61
}
},
{
"id": "A002",
"name": "James",
"grade": {
"math": 89,
"physics": 76,
"chemistry": 51
}
},
{
"id": "A003",
"name": "Jenny",
"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'形式。 | None |
default_handler | 非標準型(例:datetimeなど)の処理関数をカスタマイズします。 | None |
lines | 各行のデータを1行として出力するかどうか(適用対象:records 或 split) | False |
encoding | 出力ファイルのエンコーディング形式 | 'utf-8' |
例
# DataFrameを作成
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']
})
# 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': ['New York', 'Los Angeles', 'Chicago']
})
# 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}} その他の拡張