はじめに
ネストされた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データを簡単に解析することができます。