実現したいこと
DataFrameで保有しているデータをjsonにencodeしたいと考えています。
ただし、実際には少し複雑なデータ構造になるため、pandasのto_jsonは使わないという前提になります。
発生している問題・分からないこと
test用のデータとして次を用意します。
・データ
python
1df=pd.DataFrame({'a':[0,1,2,3,4],'b':[None,6,7,8,np.nan], 2 'c':[10,11,np.nan,np.nan,None],'d':[15,16,17,None,19], 3 'e':[np.nan,np.nan,np.nan,np.nan,np.nan]})
これを次のfor文で回しながらdictにして、最後にjson.dumpsでencodeするというプロセスです。ただし、このやり方だとnp.nanやほかのnp.int64などのデータ型もencodeのじゃまになるというところまではわかったので、エンコーダを用意することにしました。なお、pythonのバージョンは3.11.4です。
これのテスト用コードがこちらです。
python
1class NumpyEncoder(json.JSONEncoder): 2 def default(self, obj): 3 4 if isinstance(obj, np.int64): 5 return int(obj) 6 elif isinstance(obj, np.float64): 7 if np.isnan(obj): 8 return None 9 else: 10 return float(obj) 11 elif isinstance(obj, np.ndarray): 12 return obj.tolist() 13 14 return super().default(obj) 15 16dic=dict() 17for i,row in enumerate(df.index): 18 for j,col in enumerate(df.columns): 19 dic[f'{col}-{row}']=df.iloc[i,j] 20print(json.dumps(dic,indent=4,cls=NumpyEncoder))
printされて出てきたものが下です。
python
1{ 2 "a-0": 0, 3 "b-0": NaN, 4 "c-0": 10.0, 5 "d-0": 15.0, 6 "e-0": NaN, 7 "a-1": 1, 8 "b-1": 6.0, 9 "c-1": 11.0, 10 "d-1": 16.0, 11 "e-1": NaN, 12 "a-2": 2, 13 "b-2": 7.0, 14 "c-2": NaN, 15 "d-2": 17.0, 16 "e-2": NaN, 17 "a-3": 3, 18 "b-3": 8.0, 19 "c-3": NaN, 20 "d-3": NaN, 21 "e-3": NaN, 22 "a-4": 4, 23 "b-4": NaN, 24 "c-4": NaN, 25 "d-4": 19.0, 26 "e-4": NaN 27}
一応、プログラムは回るのですが、本来nullであるべきところがNaNのままになっており、試しにこれと同じ方法で出力したファイルをjupyter labで開こうとするとこれが原因で開けません。エラーメッセージは、
Unexpected token 'N', ..."文字列": NaN, "... is not valid JSON
(なお、これは上記のテストコードで出力したファイルではなく本番用のコードなのでキーが少し異なります。)
色々変えながらNaNをnullにして出力しようとしていますがうまくいきません。
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
色々調べて作成したコードなのですが、うまく行きません。jsonのencodeは正直慣れていないので初歩的なミスがある可能性が高いと思うのですが、ご助言いただけるとありがたいです。
以下のページを特に参考にしました。
カスタムオブジェクトの JSON エンコード/デコード
numpyをjson.dumpするときに気をつけたいこと
追記
最初にご回答いただいた方にも返答で書かせていただきましたが、今回はせっかくなので勉強のためエンコーダを利用する方法でやりたいと考えております。どうしても方法が見つからなさそうであれば、dict作成の段階でのデータの型変換をやりたいと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/08/15 04:45
2024/08/15 04:57
2024/08/15 08:17
2024/08/15 08:45
2024/08/15 23:50