PandasとJSONの基本

PandasはPythonのデータ分析ライブラリで、データの操作や分析を容易に行うことができます。一方、JSONはJavaScript Object Notationの略で、データ交換フォーマットの一つです。JSONは人間にとって読み書きが容易で、マシンにとっても簡単にパースや生成を行うことができます。

Pandasでは、read_json関数を使ってJSON形式の文字列やファイルを読み込むことができます。この関数はJSONデータをPandasのDataFrameオブジェクトに変換します。

import pandas as pd

# JSON形式の文字列
json_str = '{"name": ["John", "Anna", "Peter"], "age": [28, 24, 35]}'

# JSONを読み込み、DataFrameに変換
df = pd.read_json(json_str)

print(df)

また、PandasのDataFrameからJSON形式の文字列を生成することも可能です。これはto_json関数を使用します。

import pandas as pd

# データフレームの作成
df = pd.DataFrame({
    'name': ['John', 'Anna', 'Peter'],
    'age': [28, 24, 35]
})

# DataFrameをJSONに変換
json_str = df.to_json(orient='records')

print(json_str)

これらの基本的な操作を理解することで、PandasとJSONを用いたデータ分析がより容易になります。次のセクションでは、より複雑なネストしたJSONデータの取り扱いについて説明します。

ネストしたJSONデータの読み込み

JSONデータはしばしばネスト(入れ子)された形式で存在します。これは、一つのキーが配列や他のオブジェクトを値として持つ場合を指します。例えば以下のようなデータです。

{
  "employees": [
    {
      "firstName": "John",
      "lastName": "Doe"
    },
    {
      "firstName": "Anna",
      "lastName": "Smith"
    },
    {
      "firstName": "Peter",
      "lastName": "Jones"
    }
  ]
}

このようなネストされたJSONデータをPandasのDataFrameに変換するには、少し工夫が必要です。read_json関数をそのまま使用すると、ネストされた部分は一つのセルにオブジェクトとして格納されます。

import pandas as pd

# ネストされたJSON形式の文字列
json_str = '{"employees": [{"firstName": "John", "lastName": "Doe"}, {"firstName": "Anna", "lastName": "Smith"}, {"firstName": "Peter", "lastName": "Jones"}]}'

# JSONを読み込み、DataFrameに変換
df = pd.read_json(json_str)

print(df)

このDataFrameでは、各従業員の情報が一つのセルに格納されており、データ分析を行うには不便です。次のセクションでは、このようなネストされたJSONデータを適切に扱うためのjson_normalize関数について説明します。

json_normalize関数の使用

Pandasのjson_normalize関数は、ネストされたJSONデータをフラットなテーブル形式に変換するための強力なツールです。この関数は、ネストされた構造を解析し、単一のレベルのDataFrameに変換します。

以下に、先ほどのネストされたJSONデータをjson_normalize関数で処理する例を示します。

import pandas as pd
from pandas.io.json import json_normalize
import json

# ネストされたJSON形式の文字列
json_str = '{"employees": [{"firstName": "John", "lastName": "Doe"}, {"firstName": "Anna", "lastName": "Smith"}, {"firstName": "Peter", "lastName": "Jones"}]}'

# JSONをPythonの辞書に変換
data = json.loads(json_str)

# json_normalizeを使用してネストされたデータをフラットにする
df = json_normalize(data, 'employees')

print(df)

このコードは、json_normalize関数を使用してネストされたJSONデータをフラットなDataFrameに変換します。結果として得られるDataFrameでは、各従業員の情報が個々の行として表示され、各属性(firstNameやlastName)が個々の列として表示されます。

json_normalize関数は、より複雑なネスト構造を持つJSONデータに対しても使用することができます。その詳細については次のセクションで説明します。

多対多データの変換

JSONデータは、一つのキーが複数の値を持つ、いわゆる多対多の関係を表現するためにも使用されます。例えば、一人の従業員が複数のスキルを持つ場合、以下のようなJSONデータが考えられます。

{
  "employees": [
    {
      "firstName": "John",
      "lastName": "Doe",
      "skills": ["Python", "R", "SQL"]
    },
    {
      "firstName": "Anna",
      "lastName": "Smith",
      "skills": ["Java", "Scala", "SQL"]
    },
    {
      "firstName": "Peter",
      "lastName": "Jones",
      "skills": ["C#", "PowerBI", "Azure"]
    }
  ]
}

このようなデータをjson_normalize関数で処理すると、skills列がリストとして格納されます。しかし、データ分析を行う上では、各スキルが個々の行として表示される方が便利な場合があります。

import pandas as pd
from pandas.io.json import json_normalize
import json

# ネストされたJSON形式の文字列
json_str = '{"employees": [{"firstName": "John", "lastName": "Doe", "skills": ["Python", "R", "SQL"]}, {"firstName": "Anna", "lastName": "Smith", "skills": ["Java", "Scala", "SQL"]}, {"firstName": "Peter", "lastName": "Jones", "skills": ["C#", "PowerBI", "Azure"]}]}'

# JSONをPythonの辞書に変換
data = json.loads(json_str)

# json_normalizeを使用してネストされたデータをフラットにする
df = json_normalize(data, 'employees')

print(df)

このDataFrameでは、skills列がリストとして格納されています。これを各スキルが個々の行として表示される形式に変換するには、Pandasのexplode関数を使用します。

# skills列をexplodeする
df_exploded = df.explode('skills')

print(df_exploded)

このように、json_normalize関数とexplode関数を組み合わせることで、多対多の関係を持つネストされたJSONデータを適切に扱うことができます。次のセクションでは、これらの技術を用いて実際のデータ分析を行う例を示します。

実例: ファッションアイテムとコーディネートのデータ

ここでは、ファッションアイテムとそれらのアイテムを組み合わせたコーディネートのデータを扱う実例を考えます。このデータは、各コーディネートが複数のアイテムから成るため、多対多の関係を持つネストされたJSONデータとして表現されます。

{
  "coordinates": [
    {
      "name": "Casual",
      "items": ["T-shirt", "Jeans", "Sneakers"]
    },
    {
      "name": "Business",
      "items": ["Suit", "Shirt", "Tie", "Leather shoes"]
    },
    {
      "name": "Sport",
      "items": ["Sport shirt", "Shorts", "Running shoes"]
    }
  ]
}

このデータをjson_normalize関数とexplode関数を用いて適切に処理するコードは以下の通りです。

import pandas as pd
from pandas.io.json import json_normalize
import json

# ネストされたJSON形式の文字列
json_str = '{"coordinates": [{"name": "Casual", "items": ["T-shirt", "Jeans", "Sneakers"]}, {"name": "Business", "items": ["Suit", "Shirt", "Tie", "Leather shoes"]}, {"name": "Sport", "items": ["Sport shirt", "Shorts", "Running shoes"]}]}'

# JSONをPythonの辞書に変換
data = json.loads(json_str)

# json_normalizeを使用してネストされたデータをフラットにする
df = json_normalize(data, 'coordinates')

# items列をexplodeする
df_exploded = df.explode('items')

print(df_exploded)

このコードにより、各コーディネートとそれに含まれるアイテムが個々の行として表示されるDataFrameが得られます。これにより、どのコーディネートにどのアイテムが含まれているかを一目で確認することができ、さらにこのデータを基に各アイテムの使用頻度などの分析を行うことが可能になります。

以上が、PandasとJSONを用いたデータ分析の一例です。このように、PandasとJSONを組み合わせることで、様々な形式のデータを効率的に扱うことができます。これらの技術を活用して、データ分析の幅を広げてみてください。次のセクションでは、これらの技術を活用した具体的なデータ分析の例を紹介します。この記事が皆さんのデータ分析の一助となれば幸いです。それでは、次回もお楽しみに!

投稿者 kitagawa

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です