【Python】pandasでネストJSONデータを解析!簡単操作でデータ抽出

はじめに

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