【Python】Pandas ~ NaNをNoneに変換する ~

■ はじめに

小ネタ。

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