はじめに
pythonでpandasを使いcsvファイルを操作している時にエラーに遭遇しました。
今回はそのエラーが発生した原因とその時の対処方法などをまとめましたので参考になればと思います。
エラーの原因と対処方法
エラー
まず発生したエラーです
pandas.errors.IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integer
エラーの内容は
「pandas.errors.IntCastingNaNError:無限大(NAまたはinf)の値を整数に変換できません」
というものです。
原因と対処法
このエラーは、Pandasのデータフレーム内にNaN(Not a Number)または無限大(inf)などの数値ではない値が含まれていて、それを整数に変換しようとした場合に発生します。
つまり型変換で起きたエラーです。
エラーが発生するサンプルプログラムです。
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
df['A'] = df['A'].astype(int) # NaNを整数に変換しようとしてエラーが発生
pdのデータに数値以外の「np.na」がありこれをint型に変換しようとすることでエラーになります。
次はエラーを修正した例です。
直す方法は複数あります。
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
df = df.dropna() # NaNを含む行を削除
df['A'] = df['A'].astype(int) # その後、整数への変換を行う
5行目でnanタイプを削除してから変換する方法と、
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
df['A'].fillna(0, inplace=True) # NaNを0で埋める
df['A'] = df['A'].astype(int) # その後、整数への変換を行う
変換できない文字を「0」にしてから変換するという方法です。
どちらかがいいかはその時の状況によると思います。
エラーが起きやすい状況
このエラーが起きやすい状況ですが、
- データセットに欠損値(NaN)が含まれており、そのまま数値の型変換(特に整数への変換)を行った場合
- 無限大(inf)を整数に変換しようとした場合
などが考えられます。
このエラーを避けるためには、型変換を行う前にデータセット内の欠損値や無限大の値を適切に処理する必要があります。
さいごに
今回はPythonのpandasで起きた変換エラーについてでした。
csvの元ファイルがおかしい場合、変換などの一括処理でエラーになったりすることがあります。
対処方法は既に書いた通り状況によってケースバイケースですね。
(多少データに欠損があってもいい場合はDropしてしまえばいいかと、逆に欠損が気になる場合は0にしたり対応が変わります)
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。