icon

kosui / ebiebievidence

Python 3.6.3 の json.dumps が、np.nan をそのまま nan として出力する問題の解消

2018/7/13

本記事のねらい

Python 3.6.3 における json.dumps が、 np.isnan() == True となるような値を nan として出力する問題を、外部ライブラリsimplejsonによって解決する。

問題

  • Pandas では欠落値をnp.nanとして保存する
  • これをjsonライブラリを用いて出力すると、以下の通り出力の中に「nan」が紛れ込んでしまう。 RFC8259 にもあるように、NaN は許可されない。欠落値であるならば、せめてnullとして出力されるべきだ。
[
{
"id": 1,
"body": "yo",
"parent_id": nan
}
]

解決法

Python の標準ライブラリjsonは、simplejsonを取り込んだものである。しかし、simplejsonは標準ライブラリjsonよりも頻繁にアップデートされていて、機能・速度共に標準ライブラリに勝る。

simplejsondumpsは、ignore_nanという引数を持つ。

pip install simplejson でインストールした後、次のように書けばいい。

import numpy as np
import simplejson as json
numbers = [np.nan, 1, 2, 3]
json.dumps(numbers, ignore_nan=True)

すると、次のような結果を得る。

[null, 1, 2, 3]
@kosui_me
19 年に DeNA 入社。23 年にカケハシ入社。現在は、薬局向け SaaS の認証認可基盤を良くしていくお仕事をしています。