json文字列をpanda.DataFrameに読み込むメソッドであるread_jsonについてのべます。
jsonをDataFrameに読み込む read_jsonとorientオプション
jsonは非常に柔軟なデータ構造をとれます。一方DataFrameではindex、columns、データといった構造化されたデータになります。そのためDataFrameにあった形式でjsonデータを読み込むためのorientというオプションがあります。
このどのようなデータのときにどのようなオプションを用いれば良いか知っておくことが重要です。
具体的なデータをみてどのようなjsonを読み込むときにorientオプションをどのように指定すれば良いのかをのべます。
最終的には以下の形でデータフレームが読み込まれるはずです。
調査年月 地域コード 地域 地域人口
id
C0101-2015 2015-10-31 C0101 北海道 5381733
C0102-2015 2015-10-31 C0102 東北 8982807
カラム名は"調査年月","地域コード","地域","地域人口"で"id"列の"C0101-2015","C0102-2015"がインデックスになります。jsonのデータは様々な形式が考えられますが、jsonのデータ構造ごとにどのorientオプションを用いれば上記の形でDataFrameを読み込めるかを示します。
またそれぞれのソースコードには記載していませんがプログラムの先頭で以下のようにpandasをimportしていることとします。
import pandas as pd
jsonに列ごとにデータが格納されている場合 orient=columns
以下のようにjsonが列ごとのデータに固まっている場合
json_string_columns='''{
"id":{"C0101-2015":"C0101-2015","C0102-2015":"C0102-2015"}
,"調査年月":{"C0101-2015":"2015-10-31","C0102-2015":"2015-10-31"}
,"地域コード":{"C0101-2015":"C0101","C0102-2015":"C0102"}
,"地域":{"C0101-2015":"北海道","C0102-2015":"東北"}
,"地域人口":{"C0101-2015":"5381733","C0102-2015":"8982807"}
}'''
以下のようにorient='columns'を指定します。
data_frame_columns=pd.read_json(json_string_columns,orient='columns',convert_dates=['調査年月'])
data_frame_columns.set_index('id',inplace=True)
print(data_frame_columns)
以下のように表示されDataFrameに取り込まれます。
調査年月 地域コード 地域 地域人口 id C0101-2015 2015-10-31 C0101 北海道 5381733 C0102-2015 2015-10-31 C0102 東北 8982807
jsonに行ごとにデータが格納されている場合 orient=records
以下のようにjsonが行ごとのリストになっている場合
json_string_records='''[{"id":"C0101-2015", "調査年月":"2015/10/31", "地域コード":"C0101", "地域":"北海道", "地域人口": 5381733}
,{"id":"C0102-2015", "調査年月":"2015/10/31", "地域コード":"C0102", "地域":"東北", "地域人口": 8982807}]
'''
以下のようにorient='records'を指定します。
data_frame_records=pd.read_json(json_string_records,orient='records',convert_dates=['調査年月'])
data_frame_records.set_index('id',inplace=True)
print(data_frame_records)
以下のように表示されDataFrameに取り込まれます。
調査年月 地域コード 地域 地域人口 id C0101-2015 2015-10-31 C0101 北海道 5381733 C0102-2015 2015-10-31 C0102 東北 8982807
indexとcolumnsとデータが分かれてjsonに格納されている場合 orient=split
以下のようにjsonがindex、columns、dataで分かれている場合
json_string_split='''{"index":["C0101-2015","C0102-2015"]
,"columns":["id","調査年月","地域コード","地域","地域人口"]
,"data":[
["C0101-2015","2015-10-31","C0101","北海道","5381733"]
,["C0102-2015","2015-10-31","C0102","東北","8982807"]
]
}'''
以下のようにorient='split'を指定します。
data_frame_split=pd.read_json(json_string_split,orient='split',convert_dates=['調査年月'])
data_frame_split.set_index('id',inplace=True)
print(data_frame_split)
以下のように表示されDataFrameに取り込まれます。
調査年月 地域コード 地域 地域人口 id C0101-2015 2015-10-31 C0101 北海道 5381733 C0102-2015 2015-10-31 C0102 東北 8982807
index毎にカラム名:値、カラム名:値と言う形でデータがjsonに格納されている場合 orient=index
以下のようにjsonがindex毎にカラム名:値、カラム名:値と言う形でデータが格納されている場合
json_string_index='''{
"C0101-2015":{"id":"C0101-2015","調査年月":"2015-10-31","地域コード":"C0101","地域":"北海道","地域人口":"5381733"}
,"C0102-2015":{"id":"C0102-2015","調査年月":"2015-10-31","地域コード":"C0102","地域":"東北","地域人口":"8982807"}
}'''
以下のようにorient='index'を指定します。
data_frame_index=pd.read_json(json_string_index,orient='index',convert_dates=['調査年月'])
data_frame_index.set_index('id',inplace=True)
print(data_frame_index)
以下のように表示されDataFrameに取り込まれます。
調査年月 地域コード 地域 地域人口 id C0101-2015 2015-10-31 C0101 北海道 5381733 C0102-2015 2015-10-31 C0102 東北 8982807
データのみがjsonに格納されている場合 orient=values
以下のようにjsonがindex毎にカラム名:値、カラム名:値と言う形でデータが格納されている場合
json_string_values='''[
["C0101-2015","2015-10-31","C0101","北海道","5381733"]
,["C0102-2015","2015-10-31","C0102","東北","8982807"]
]'''
以下のようにorient='values'を指定します。またそのままではカラムがセットされないためカラムをセットしておきます。
data_frame_values=pd.read_json(json_string_values,orient='values')
data_frame_values.columns=["id","調査年月","地域コード","地域","地域人口"]
data_frame_values.set_index('id',inplace=True)
以下のように表示されDataFrameに取り込まれます。
調査年月 地域コード 地域 地域人口 id C0101-2015 2015-10-31 C0101 北海道 5381733 C0102-2015 2015-10-31 C0102 東北 8982807
まとめ
今回はread_jsonでjsonをDataFrameに読み込みました。jsonのデータ構造によってorientオプションを適切に付与する必要があります。どのようなときにどのようなオプションを指定すれば良いか理解しておく必要があります。
Comment on this article
コメントはまだありません。
Send comments