この記事では,pythonのデータをjson形式で保存,それを読み取る方法を説明する.特に,pandasのデータフレームのjson形式での保存と読み取りに焦点を当てていく.
pythonとjsonの変換の関連
[1]によれば,pythonとjsonとの型の関連は以下のテーブルのようになる.また,pandasのnp.nanはjsonでは,NaNとなる.
単純な辞書型からjson形式への変換は以下のようにすれば良い.
import json import pandas as pd # sample data dic = { "firstName": "Jane", "hobbies": ["running", "sky diving", "singing"], "age": 35, "weight" : 65.6, "boolen" : [True,False,None], "secret" : np.nan, } with open("data.json","w") as f: json.dump(dic,f)
読み取るには,json.loadかjson.loadsを用いる.後者は,jsonからpythonへ変換できない型が現れた場合でも文字列として読み込む方法である.
with open("data.json", "r") as f: data = json.load(f)
もし,ファイルに保存せずに, 今のプログラムでjson形式のデータを作業する場合は, json.dumps を用いる.また,デフォルトだとjsonは余白を詰めてしまう.pythonでの出力を見やすい状態にするには,optionのindentを用いる.
a = json.dumps(dic,indent = 4) print(a)
pandasのデータフレームをjsonで取り扱う
単にpandasのデータフレームをjsonファイルに変換,元に戻すにはpandasのメソッドが提供されている.一旦,データとして保存する場合はもはや,jsonモジュールを使わないことに気をつけよう.
df = pd.DataFrame({ "A":["A1","A2","A3"], "B":[1,1.2,1.333], "C":[1,2,3]}) # save as json file dfjs = df.to_json() with open("df.json","w") as f: f.write(dfjs) # read a json file with open("df.json","r") as f: d = f.read() df_ = pd.read_json(d)
これで,df_は元のデータフレームとして保存される.
jsonモジュールを使用した方法ならば,以下のような変換が考えられる.
# save as json file dfdic = df.to_dict() with open("df.json","w") as f: json.dump(dfdic,f) # read a json file with open("df.json","r") as f: d = json.load(f) df_ = pd.DataFrame(d)
次に,pandasのデータフレームが組み込まれている場合を考える.これは,pandasのデータフレームをdict型にして保存しておくと,読み取る際には,pandasのデータフレームとして使いたい場合は該当部分を返還することで取り扱うことが可能だ.
lis ={"data": [ {"index":1, "df":df.to_dict() }, {"index":2, "df":df.to_dict() } ] } with open("df.json","w") as f: json.dump(lis,f) with open("df.json","r") as f: lis_ = json.load(f) df_ = pd.DataFrame(lis_["data"][0]["df"])
こうすることでdf_の中に元のdfというデータフレームを入れることができる.
参考文献
[1] Reading and Writing JSON to a File in Python, https://stackabuse.com/reading-and-writing-json-to-a-file-in-python/
[2] Working With JSON Data in Python, https://realpython.com/python-json/
[3] pandas.DataFrame, Seriesを辞書に変換(to_dict), https://note.nkmk.me/python-pandas-to-dict/
コメント
[…] で “ensure_ascii”はFalseにしておく.もし,jsonファイルのpythonでの取り扱いが分からない場合は,拙著のpandasのデータフレームをjson形式で保存,読み取る方法 を読んでみてほしい. […]
[…] もし,tweepyでtwitterのstreaming API以外のAPI機能の使い方について怪しかったならば,拙著のtwitterのデータ探索に関わるtweepyの基本機能の解説を読んでおくと良い.また,jsonの基本的な操作については,拙著のpandasのデータフレームをjson形式で保存,読み取る方法を読んでおくといい. […]