Pandasのjson_normalizeでネストしているJSONをフラット化する

作成
2020-03-08

Pandasで次のようなデータを何も考えずにデータフレームに入れてしまうと、値が取り出しにくいです。例えば以下のようなJSON。

[
    {
        "id": '0',
        "details": {
            "lat": "43.06417",
            "lng": "141.34694",
            "name": "札幌市"
        }
    }, {
        "id": '1',
        "details": {
            "lat": "39.71861",
            "lng": "140.1025",
            "name": "秋田市"
        }
    }, {
        "id": '2',
        "details": {
            "lat": "35.68944",
            "lng": "139.69167",
            "name": "新宿区"
        }
    }
]

これをPandasに入れてCSVに出力すると、CSVには構造を維持したまま保存されています。

import pandas as pd

team_df = pd.DataFrame(data=[
    {
        "id": '0001',
        "details": {
            "lat": "43.06417",
            "lng": "141.34694",
            "name": "札幌市"
        }
    }, {
        "id": '0002',
        "details": {
            "lat": "39.71861",
            "lng": "140.1025",
            "name": "秋田市"
        }
    }, {
        "id": '0003',
        "details": {
            "lat": "35.68944",
            "lng": "139.69167",
            "name": "新宿区"
        }
    }
])

team_df.to_csv('./teams.csv')
,id,details
0,0001,"{'lat': '43.06417', 'lng': '141.34694', 'name': '札幌市'}"
1,0002,"{'lat': '39.71861', 'lng': '140.1025', 'name': '秋田市'}"
2,0003,"{'lat': '35.68944', 'lng': '139.69167', 'name': '新宿区'}"

やり方

このようにデータの一部にレコード型のデータを含んでいるものは分析しにくいのでjson_normalize()を使います。

from pandas.io.json import json_normalize

team_df = json_normalize(data=[
    {
        "id": '0',
        "details": {
            "lat": "43.06417",
            "lng": "141.34694",
            "name": "札幌市"
        }
    }, {
        "id": '1',
        "details": {
            "lat": "39.71861",
            "lng": "140.1025",
            "name": "秋田市"
        }
    }, {
        "id": '2',
        "details": {
            "lat": "35.68944",
            "lng": "139.69167",
            "name": "新宿区"
        }
    }
], max_level=1)

team_df.to_csv('./teams.csv')
,id,details.lat,details.lng,details.name
0,0,43.06417,141.34694,札幌市
1,1,39.71861,140.1025,秋田市
2,2,35.68944,139.69167,新宿区

参考