はじめに
ネストされたJSONデータを扱うことは、データ解析の現場で非常によくあることです。JSONデータは、ウェブAPIやNoSQLデータベースなどから取得されることが多いため、ネストされたJSONデータを解析することは、現代のデータ解析に不可欠なスキルの1つといえます。
この記事では、Pythonのライブラリであるpandasを使用して、ネストされたJSONデータを解析する方法について説明します。pandasは、データの読み込み、加工、分析において非常に便利なライブラリであり、JSONデータの解析にも優れた機能を持っています。
ネストされたJSONデータの概要
JSON(JavaScript Object Notation)は、JavaScriptで使われるオブジェクトの表現方法を用いて、データを表現するための軽量な形式です。JSONデータは、キーと値のペアから構成され、複数のキーと値のペアを含むことができます。ネストされたJSONデータは、1つのキーに対して、別のJSONデータが入れ子になっている形式です。
例えば、次のようなネストされたJSONデータがあるとします。
{
"id": 123,
"name": "John Smith",
"age": 35,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phone_numbers": [
{
"type": "home",
"number": "555-555-1234"
},
{
"type": "work",
"number": "555-555-5678"
}
]
}
このJSONデータには、以下のような構造があります。
- id, name, ageというキーに対して、単一の値が格納されている。
- addressというキーに対して、別のJSONデータが格納されている。
- phone_numbersというキーに対して、複数のJSONデータが格納されている。
このようなネストされたJSONデータを解析するには、pandasライブラリを使用することができます。
pandasでネストされたJSONデータを読み込む方法
pandasでは、jsonライブラリを使用して、JSONデータをDataFrameオブジェクトに変換することができます。次のように、jsonライブラリを使用してJSONデータを読み込み、pandasのDataFrameオブジェクトに変換することができます。
import pandas as pd
import json
# JSONデータを読み込む
with open('data.json', 'r') as f:
json_data = json.load(f)
# DataFrameオブジェクトに変換する
df = pd.json_normalize(json_data)
ここでは、json_normalize()関数を使用して、ネストされたJSONデータをフラットなDataFrameオブジェクトに変換しています。json_normalize()関数は、JSONデータを扱いやすくするために、ネストされたJSONデータをフラットなDataFrameオブジェクトに変換することができます。
JSONデータの構造を確認する方法
pandasを使用してJSONデータを読み込むと、データの構造を確認することができます。DataFrameオブジェクトのshape属性を使用することで、DataFrameオブジェクトの行数と列数を確認することができます。
# DataFrameオブジェクトの行数と列数を確認する print(df.shape)
また、DataFrameオブジェクトのhead()メソッドを使用することで、DataFrameオブジェクトの最初の5行を表示することができます。
# DataFrameオブジェクトの最初の5行を表示する print(df.head())
ネストされたJSONデータをフラットなデータフレームに変換する方法
ネストされたJSONデータをフラットなDataFrameオブジェクトに変換するには、json_normalize()関数を使用することができます。
json_normalize()関数は、キーに対して値が単一の場合、値が単一の列に展開されます。キーに対して値がリストの場合、それぞれのリストの要素が別々の行として展開されます。
例えば、次のようなJSONデータがあるとします。
[
{
"id": 1,
"name": "John Smith",
"age": 35,
"address":
{
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phone_numbers": [
{
"type": "home",
"number": "555-555-1234"
},
{
"type": "work",
"number": "555-555-5678"
}
]
},
{
"id": 2,
"name": "Jane Doe",
"age": 40,
"address": {
"street": "456 Oak Ave",
"city": "Othertown",
"state": "NY",
"zip": "67890"
},
"phone_numbers": [
{
"type": "home",
"number": "555-555-5678"
}
]
}
]
このJSONデータをフラットなDataFrameオブジェクトに変換するには、次のようにjson_normalize()関数を使用します。
import pandas as pd
import json
# JSONデータを読み込む
with open('data.json', 'r') as f:
json_data = json.load(f)
# DataFrameオブジェクトに変換する
df = pd.json_normalize(json_data)
json_normalize()関数を使用すると、次のようなDataFrameオブジェクトが得られます。
id name age ... address.city address.state address.zip 0 1 John Smith 35 ... Anytown CA 12345 1 2 Jane Doe 40 ... Othertown NY 67890
このDataFrameオブジェクトを見ると、以下のことが分かります。
- キーに対して値が単一の場合、値が単一の列に展開されている。
- キーに対して値がリストの場合、それぞれのリストの要素が別々の行として展開されている。
- ネストされたJSONデータが、フラットなDataFrameオブジェクトに変換されている。
データフレームから必要な情報を抽出・加工する方法
ネストされたJSONデータをフラットなDataFrameオブジェクトに変換することで、必要な情報を抽出・加工することが容易になります。DataFrameオブジェクトの各列は、pandasのSeriesオブジェクトとしてアクセスすることができます。
例えば、次のようなDataFrameオブジェクトがあるとします。
id name age address.street address.city address.state address.zip phone_numbers \
0 1 John Smith 35 123 Main St Anytown CA 12345 [{'type': 'home', 'number': '555-555-1234'...
1 2 Jane Doe 40 456 Oak Ave Othertown NY 67890 [{'type': 'home', 'number': '555-555-5678'}]
phone_numbers.type phone_numbers.number
0 home 555-555-1234
1 home 555-555-5678
このDataFrameオブジェクトから、住所と電話番号の情報だけを抽出するには、以下のようにして、iloc[]メソッドを使用して、DataFrameオブジェクトの特定の行や列にアクセスすることができます。
# 住所と電話番号の情報だけを抽出する address = df[['address.street', 'address.city', 'address.state', 'address.zip']] phone_numbers = df[['phone_numbers.type', 'phone_numbers.number']] print(address) print(phone_numbers)
このプログラムを実行すると、以下のような出力が得られます。
address.street address.city address.state address.zip 0 123 Main St Anytown CA 12345 1 456 Oak Ave Othertown NY 67890 phone_numbers.type phone_numbers.number 0 home 555-555-1234 1 home 555-555-5678
このように、DataFrameオブジェクトから必要な情報を抽出することができます。また、pandasのSeriesオブジェクトを使用して、必要な情報を加工することもできます。例えば、次のようにして、電話番号の最初の3桁だけを取得することができます。
# 電話番号の最初の3桁だけを取得する phone_numbers['phone_numbers.number'] = phone_numbers['phone_numbers.number'].str[:3] print(phone_numbers)
このプログラムを実行すると、以下のような出力が得られます。
phone_numbers.type phone_numbers.number 0 home 555 1 home 555
まとめ
この記事では、Pythonのライブラリであるpandasを使用して、ネストされたJSONデータを解析する方法について説明しました。pandasは、データの読み込み、加工、分析において非常に便利なライブラリであり、JSONデータの解析にも優れた機能を持っています。また、pandasを使用することで、データの構造を確認したり、必要な情報を抽出・加工することが簡単にできます。
本記事で説明した内容をまとめると、以下のとおりです。
- pandasを使用して、JSONデータをDataFrameオブジェクトに変換することができる。
- json_normalize()関数を使用して、ネストされたJSONデータをフラットなDataFrameオブジェクトに変換することができる。
- DataFrameオブジェクトから必要な情報を抽出・加工することができる。
これらの機能を使うことで、ネストされたJSONデータを簡単に解析することができます。




![Pandasとnumpyをそれぞれ高速に変換する方法[Python]](https://machine-learning-skill-up.com/knowledge/wp-content/uploads/2023/10/1-43.jpg)
