■ はじめに
小ネタ。
https://dk521123.hatenablog.com/entry/2022/02/16/000000
で扱った pd.read_json() をテストしていたら、 意図した動作にならなかった。 原因を探っていたら、None(null)になってほしい値が Nan(非数(英語:Not a Number))になっていた。
目次
【1】NaNになってしまう例 1)補足:Nullにならないパターン 【2】NaNをNoneに変換する方法 方法1:df.where(df.notnull(), None) 方法2:df.replace([np.nan], [None])
【1】NaNになってしまう例
import pandas as pd df = pd.read_json("demo.json", encoding="UTF8") print(df) data = df.to_dict(orient="records") print(data)
demo.json
[ { "id": "x0001", "name": "Mike", "position": "programmer", "remarks": null }, { "id": "x0002", "name": "Tom", "position": "Manager", "remarks": null }, { "id": "x0003", "name": "Sam", "position": "" }, { "id": "x0004", "name": "Jim", "position": "", "remarks": null }, { "id": "x0005", "name": "Smith", "position": "programmer", "remarks": null } ]
出力結果
0 x0001 Mike programmer NaN 1 x0002 Tom Manager NaN 2 x0003 Sam NaN 3 x0004 Jim NaN 4 x0005 Smith programmer NaN [{'id': 'x0001', 'name': 'Mike', 'position': 'programmer', 'remarks': nan}, {'id': 'x0002', 'name': 'Tom', 'position': 'Manager', 'remarks': nan}, {'id': 'x0003', 'name': 'Sam', 'position': '', 'remarks': nan}, {'id': 'x0004', 'name': 'Jim', 'position': '', 'remarks': nan}, {'id': 'x0005', 'name': 'Smith', 'position': 'programmer', 'remarks': nan}]
1)補足:Nullにならないパターン
* 「"remarks": null」のように null を設定している場合 * 指定した設定値自体がない場合 (例:"id": "x0003"のデータで「remarks」がない)
【2】NaNをNoneに変換する方法
* 以下に載っている。
http://pixelbeat.jp/replace-nan-with-none-in-pandas-dataframe/
方法1:df.where(df.notnull(), None)
import pandas as pd df = pd.read_json("demo.json", encoding="UTF8") # ★注目★ df = df.where(df.notnull(), None) print(df) data = df.to_dict(orient="records") print(data)
出力結果
id name position remarks 0 x0001 Mike programmer None 1 x0002 Tom Manager None 2 x0003 Sam None 3 x0004 Jim None 4 x0005 Smith programmer None [{'id': 'x0001', 'name': 'Mike', 'position': 'programmer', 'remarks': None}, {'id': 'x0002', 'name': 'Tom', 'position': 'Manager', 'remarks': None}, {'id': 'x0003', 'name': 'Sam', 'position': '', 'remarks': None}, {'id': 'x0004', 'name': 'Jim', 'position': '', 'remarks': None}, {'id': 'x0005', 'name': 'Smith', 'position': 'programmer', 'remarks': None}]
方法2:df.replace([np.nan], [None])
import pandas as pd import numpy as np df = pd.read_json("demo.json", encoding="UTF8") # ★注目★ df = df.replace([np.nan], [None]) print(df) data = df.to_dict(orient="records") print(data)
参考文献
http://pixelbeat.jp/replace-nan-with-none-in-pandas-dataframe/
関連記事
Pandas ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/22/014957
Pandas ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/10/14/000000
Pandas ~ 基本編 / データフレーム ~
https://dk521123.hatenablog.com/entry/2021/07/25/000000
Pandas ~ データフレームの相互変換 ~
https://dk521123.hatenablog.com/entry/2022/02/15/000000
Pandas ~ 基本編 / CSV編 ~
https://dk521123.hatenablog.com/entry/2020/11/17/000000
Pandas ~ 基本編 / JSON編 ~
https://dk521123.hatenablog.com/entry/2022/02/16/000000
Pandas ~ 基本編 / Excel編 ~
https://dk521123.hatenablog.com/entry/2020/11/18/000000
Pandas ~ 基本編 / Excel => CSVに変換 ~
https://dk521123.hatenablog.com/entry/2021/01/25/000000
Pandas ~ to_xxxx / 出力編 ~
https://dk521123.hatenablog.com/entry/2021/04/10/192752
Pandas ~ Parquet ~
https://dk521123.hatenablog.com/entry/2024/09/06/004125