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,新宿区