JSON を Pandas DataFrame に変換する

Manav Narula 2023年1月30日
  1. json_normalize() を使った JSON から Pandas の DataFrame への変換
  2. read_json() を使って Pandas の DataFrame に JSON を出力した例
JSON を Pandas DataFrame に変換する

この記事では、JSON を Pandas の DataFrame に変換する方法を紹介します。

JSON とは、JavaScript Object Notation の略です。JavaScript のオブジェクトのフォーマットを基にしたもので、構造化されたデータを表現するための符号化技術です。最近では特にサーバー間や Web アプリケーション間でデータを共有するために広く使われています。

そのシンプルさとプログラミング言語のデータ構造の影響を受けて、JSON は非常に人気が高まっています。比較的理解しやすく、以下は API からの JSON レスポンスの簡単な例です。

{
"Results":
         [
         { "id": "01", "Name": "Jay" },
         { "id": "02", "Name": "Mark" },
         { "id": "03", "Name": "Jack" }
         ],
"status": ["ok"]
}

この例でわかるように、JSON はネストされたリストと辞書の組み合わせのように見えます。そのため、JSON ファイルからデータを抽出したり、Pandas の DataFrame として保存することさえ比較的簡単にできます。

Python の Pandas と JSON ライブラリはこれを実現するのに役立ちます。JSON の文字列を DataFrame に変換するのに役立つ 2つの関数 read_json()json_normalize() があります。

json_normalize() を使った JSON から Pandas の DataFrame への変換

json_normalize() 関数は、ネストした JSON 文字列を読み込んで DataFrame を返すために非常に広く利用されています。この関数を利用するには、まず Python の JSON ライブラリの json.loads() 関数を用いて JSON を読み込む必要があります。次に、この JSON オブジェクトを json_normalize() に渡すと、必要なデータを含む Pandas の DataFrame が返されます。

import pandas as pd
import json
from pandas import json_normalize

data = """
{
"Results":
         [
         { "id": "1", "Name": "Jay" },
         { "id": "2", "Name": "Mark" },
         { "id": "3", "Name": "Jack" }
         ],
"status": ["ok"]
}
    """

info = json.loads(data)

df = json_normalize(info["Results"])  # Results contain the required data
print(df)

出力:

   id  Name
0  1   Jay
1  2  Mark
2  3  Jack

read_json() を使って Pandas の DataFrame に JSON を出力した例

JSON を DataFrame に変換するもう一つの Pandas 関数は、よりシンプルな JSON 文字列の場合は read_json() です。Pandas DataFrame にデータを格納するための関数に、JSON ファイルのパスや JSON 文字列を直接渡すことができます。read_json() には多くのパラメータがありますが、その中でも orient は JSON 文字列の形式を指定します。

欠点は、ネストした JSON 文字列では使いにくいということです。そこで、read_json() を使用するために、以下に示すようにもっとシンプルな例を使用します。

import pandas as pd

data = """
          {
              "0":{
                  "Name": "Jay",
                  "Age": "17"
              },
              "1":{
                  "Name": "Mark",
                  "Age": "15"
              },
              "2":{
                  "Name": "Jack",
                  "Age":"16"
              }
          }
    """

df = pd.read_json(data, orient="index")
print(df)

出力:

   Name  Age
0   Jay   17
1  Mark   15
2  Jack   16

これは、at からの JSON 文字列が {index : {column: value}} というパターンにマッチしているからです。

著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

関連記事 - Pandas DataFrame

関連記事 - Pandas JSON