JSON を Pandas DataFrame に変換する

  1. json_normalize() を使った JSON から Pandas の DataFrame への変換
  2. read_json() を使って Pandas の DataFrame に JSON を出力した例

この記事では、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}} というパターンにマッチしているからです。

関連記事 - Pandas DataFrame

  • Pandas DataFrame を 1つの列の値で並べ替える方法
  • Pandas Dataframe で値が発生する頻度をカウントする方法
  • 関連記事 - Pandas JSON

  • Pandas の DataFrame を分割する
  • Pandas DataFrame のすべての列を表示する