(121) PandasではCSVファイルの未入力セルをNaNとする。

投稿者: | 2024年2月8日

101 views

【1】問題発生

前投稿 (120) PandasでCSVファイルの中身を変更してCSVファイルに保存 では、ロードした CSVファイルの中身を書き換える練習をした。
この時に試した CSVファイルの中に、セルの値が未入力の物があり、以下のエラーが発生した。

>>> df['住所'] = df['住所'].apply(lambda x: re.sub(r'\d.*', '', x))
Traceback (most recent call last):
  File "", line 1, in 
  File "Python312/site-packages/pandas/core/series.py", line 4904, in apply
    ).apply()
      ^^^^^^^
  File "Python312/site-packages/pandas/core/apply.py", line 1427, in apply
    return self.apply_standard()
           ^^^^^^^^^^^^^^^^^^^^^
  File "Python312/site-packages/pandas/core/apply.py", line 1507, in apply_standard
    mapped = obj._map_values(
             ^^^^^^^^^^^^^^^^
  File "Python312/site-packages/pandas/core/base.py", line 921, in _map_values
    return algorithms.map_array(arr, mapper, na_action=na_action, convert=convert)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "Python312/site-packages/pandas/core/algorithms.py", line 1743, in map_array
    return lib.map_infer(values, mapper, convert=convert)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "lib.pyx", line 2972, in pandas._libs.lib.map_infer
  File "", line 1, in 
  File "__init__.py", line 186, in sub
    return _compile(pattern, flags).sub(repl, string, count)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: expected string or bytes-like object, got 'float'

ん?
CSVファイルのデータの中に float値なんか入ってないぞ?

【2】原因

CSVファイルの中に、空白セル が含まれていた。

この CSVファイルを pandas.read_csv() で読み出した時に、
空白セルの値が NAN (Not a Number)として認識 されていた。
Pandasでは、そういう仕様らしい。

【3】対応策

プログラムの該当箇所を以下のように書き換えて対応することにした。
セルの値が文字列型か?
if isinstance(x, str) でチェックした後に re.sub() を実行するようにした。

before

df[2] = df[2].apply(lambda x: re.sub(r'\d.*', '', x))

after

df[2] = df[2].apply(lambda x: re.sub(r'\d.*', '', x) if isinstance(x, str) else x)

【4】補足情報

ChatGPT大先生から以下の謹言を賜った。

CSVファイル内で、何らかのセルが未入力(空白)である場合、PandasはそのセルをNaNとしてDataFrame内に読み込みます。

欠損値の扱い
Pandasでは、NaN値を扱うためのいくつかの便利なメソッドがあります。

例えば:
isna()またはisnull()を使用して、データフレーム内のNaN値を検出する。
fillna()を使用して、NaN値を特定の値や方法(前の値や次の値で埋めるなど)で置き換える。
dropna()を使用して、NaN値を含む行や列を削除する。

注意点
Pandasはデフォルトで空白のセルをNaNとして扱いますが、read_csv関数のna_valuesパラメータを使用して、NaNとして認識させたい他の値(例えば特定の文字列や記号)を指定することもできます。

また、数値データの列でNaNが使用される場合、その列は浮動小数点型に自動的に変換されます。
これは、Pandasが整数型の列にNaN値を格納することができないためです(Pandasのバージョンによっては、整数型のNA値を扱う新しいデータ型が導入されている場合があります)。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です