Pandas DataFrameをJSONに変換・保存!to_json()でデータ連携をスムーズに 🔗


 

Pandasで分析したデータを、WebアプリケーションやAPI連携、NoSQLデータベースなどで広く使われる**JSON (JavaScript Object Notation)**形式で出力したい場面は多々あります。PandasのDataFrameには、このJSON形式への変換を簡単に行えるto_json()メソッドが用意されています。

この記事では、DataFrameをJSON文字列として変換する方法、ファイルとして保存する方法、そして出力形式を細かく制御するオプションについて詳しく解説します。


 

to_json()の基本:DataFrameをJSONに変換 🌐

 

to_json()メソッドは、DataFrameの内容をJSON形式の文字列として返したり、直接ファイルに書き込んだりすることができます。

 

最もシンプルなJSON文字列への変換

 

to_json()を引数なしで実行すると、デフォルトの形式でJSON文字列が返されます。

Python
 
import pandas as pd

# サンプルDataFrameを作成
df = pd.DataFrame({
    'ID': [1, 2],
    'Name': ['Alice', 'Bob'],
    'Score': [85, 92]
})

# DataFrameをJSON文字列に変換
json_string = df.to_json()
print("--- JSON文字列 ---")
print(json_string)
# 出力例 (デフォルト形式: 列志向)
# {"ID":{"0":1,"1":2},"Name":{"0":"Alice","1":"Bob"},"Score":{"0":85,"1":92}}

 

JSONファイルとして保存する

 

ファイルパスを引数に指定すると、JSON文字列が直接ファイルに書き込まれます。

Python
 
import pandas as pd
import os # ファイル操作用

df = pd.DataFrame({
    'Product': ['Laptop', 'Mouse'],
    'Price': [1200, 25]
})

output_file = 'products.json'
df.to_json(output_file)

print(f"'{output_file}' にDataFrameをJSON形式で書き出しました。")

# 作成されたファイルの内容を確認 (オプション)
# with open(output_file, 'r', encoding='utf-8') as f:
#     print("\n--- ファイル内容 ---")
#     print(f.read())

# 不要なファイルを削除
# os.remove(output_file)

 

to_json()の便利なオプション 🛠️

 

to_json()は、JSONの出力形式を細かく制御するためのいくつかの重要なオプションを提供します。

 

1. orient:JSON出力の構造指定

 

orientオプションは、JSONの構造をどのようにするかを指定する最も重要なオプションです。

  • 'columns' (デフォルト): 列志向。各列がキーとなり、その値がインデックスと値の辞書になります。

    Python
     
    import pandas as pd
    df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    print(df.to_json(orient='columns'))
    # {"A":{"0":1,"1":2},"B":{"0":3,"1":4}}
    
  • 'index': インデックス志向。各インデックスがキーとなり、その値が列名と値の辞書になります。

    Python
     
    import pandas as pd
    df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    print(df.to_json(orient='index'))
    # {"0":{"A":1,"B":3},"1":{"A":2,"B":4}}
    
  • 'records': レコード志向。各行が辞書のリストになります。Web APIなどでよく使われる形式です。

    Python
     
    import pandas as pd
    df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    print(df.to_json(orient='records'))
    # [{"A":1,"B":3},{"A":2,"B":4}]
    
  • 'split': スプリット志向。JSONにindexcolumnsdataの3つのキーを持つ辞書として出力します。

    Python
     
    import pandas as pd
    df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    print(df.to_json(orient='split'))
    # {"index":[0,1],"columns":["A","B"],"data":[[1,3],[2,4]]}
    
  • 'values': 値のみ。値のリストのリスト(ネストされたリスト)として出力します。

    Python
     
    import pandas as pd
    df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    print(df.to_json(orient='values'))
    # [[1,3],[2,4]]
    
  • 'table': テーブルスキーマ形式。データの他に、列情報(スキーマ)も含む形式です。

    Python
     
    import pandas as pd
    df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    print(df.to_json(orient='table'))
    # {"schema":{"fields":[{"name":"index","type":"integer"},{"name":"A","type":"integer"},{"name":"B","type":"integer"}],"primaryKey":["index"],"pandas_version":"1.5.3"},"data":[{"index":0,"A":1,"B":3},{"index":1,"A":2,"B":4}]}
    

 

2. indent:出力のインデント

 

JSON文字列を見やすくするために、インデント(字下げ)を追加したい場合に指定します。

Python
 
import pandas as pd
df = pd.DataFrame({'Item': ['Laptop', 'Keyboard'], 'Price': [1200, 75]})
print("--- インデントなし ---")
print(df.to_json(orient='records'))

print("\n--- インデントあり (2スペース) ---")
print(df.to_json(orient='records', indent=2))
# 出力例:
# [
#   {
#     "Item": "Laptop",
#     "Price": 1200
#   },
#   {
#     "Item": "Keyboard",
#     "Price": 75
#   }
# ]

 

3. date_format:日付・時刻形式の指定

 

DataFrameに日付・時刻データが含まれる場合、JSONでの出力形式を指定できます。

  • 'iso' (デフォルト): ISO 8601形式で出力します。

  • 'epoch': エポック秒(1970年1月1日UTCからの経過秒数)で出力します。

Python
 
import pandas as pd
import datetime

df_date = pd.DataFrame({
    'Event': ['Start', 'End'],
    'DateTime': [datetime.datetime(2023, 1, 1, 10, 0, 0), datetime.datetime(2023, 1, 1, 11, 30, 0)]
})

print("--- 日付: ISO形式 (デフォルト) ---")
print(df_date.to_json(orient='records'))

print("\n--- 日付: エポック形式 ---")
print(df_date.to_json(orient='records', date_format='epoch'))

 

4. force_ascii:ASCII文字以外の扱い

 

デフォルトではTrue(非ASCII文字はエスケープされる)ですが、Falseにすると非ASCII文字もそのまま出力されます。日本語などを扱う場合はFalseにすると読みやすくなります。

Python
 
import pandas as pd

df_jp = pd.DataFrame({'地域': ['東京', '大阪']})

print("--- force_ascii=True (デフォルト) ---")
print(df_jp.to_json(orient='records', force_ascii=True))
# 出力例: [{"\u5730\u57df":"\u6771\u4eac"},{"\u5730\u57df":"\u5927\u962a"}]

print("\n--- force_ascii=False ---")
print(df_jp.to_json(orient='records', force_ascii=False))
# 出力例: [{"地域":"東京"},{"地域":"大阪"}]

 

5. double_precision:浮動小数点数の精度

 

浮動小数点数をJSONに書き出す際の精度を制御します(最大桁数を指定)。

Python
 
import pandas as pd
import numpy as np

df_float = pd.DataFrame({'Value': [0.123456789, 123.456789]})

print("--- デフォルトの精度 ---")
print(df_float.to_json(orient='records'))

print("\n--- 精度を2桁に制限 ---")
print(df_float.to_json(orient='records', double_precision=2))
# 出力例: [{"Value":0.12},{"Value":123.46}]

 

まとめ

 

Pandasのto_json()メソッドは、DataFrameをJSON形式の文字列またはファイルとして出力するための非常に強力で柔軟なツールです。

  • JSON文字列への変換: df.to_json()

  • JSONファイルへの保存: df.to_json('filename.json')

  • 出力構造の指定: orientオプション ('records', 'columns', 'index'など)

  • 見やすいインデント: indentオプション

  • 日付形式の制御: date_formatオプション

  • 日本語の表示: force_ascii=False

これらのオプションを使いこなすことで、Pandasで処理したデータを様々なシステムやアプリケーションとスムーズに連携させることができるでしょう。ぜひto_json()をマスターして、データ活用の幅を広げてください!