データに欠損値(NaN)が含まれていた場合の対応方法三選

Python

結論

  • 一選.replace関数で欠損値(NaN)を任意の文字に置き換える
  • 二選.dropna関数で欠損値(NaN)が含まれている行を削除する
  • 三選.fillna関数で欠損値(NaN)を任意の文字で穴埋めする

経緯

機械学習用のデータで、欠損していないデータは稀です。欠損値(NaN)を含む行を削除してしまうと、データの件数が減り、モデルの精度に影響が出てしまいます。「欠損値(NaN)を任意の文字に置き換える、行を削除する、任意の文字で穴埋めする方法をまとめした。

対応方法

一選.replace関数で欠損値(NaN)を任意の文字に置き換える方法

import pandas as pd
import numpy as np

# データを読み込む
df = pd.read_csv('./13101_20201_20204.csv', encoding='cp932')

# replase未実施の結果を表示する
print(df.isnull().sum())

# '地域'の項目で欠損値(NaN)となっている箇所を'1'で置き換える
df_replace = df.replace({'地域': {np.nan: '1'}})

# replace実施の結果を表示する
print(df_replace.isnull().sum())

実行結果

# replace未実施の結果
種類  0
地域  230
市区町村コード  0
都道府県名      0
~中略~

# replace実施の結果
種類  0
地域  0
市区町村コード  0
都道府県名      0
~中略~

二選.dropna関数で欠損値(NaN)が含まれている行を削除する方法

import pandas as pd

# データを読み込む
df = pd.read_csv('./13101_20201_20204.csv', encoding='cp932')

# dropna未実施の結果を表示する
print(df.isnull().sum())

# '今後の利用目的'の項目で欠損値(NaN)となっている行を削除する
df_dropna = df.dropna(subset = ['今後の利用目的'])

# dropna実施の結果を表示する
print(df_dropna.isnull().sum())

実行結果

# dropna未実施の結果
~中略~
建物の構造    18
用途        100
今後の利用目的 15
前面道路:方位  230
前面道路:種類  230
~中略~

# dropna実施の結果
~中略~
建物の構造    15
用途        91
今後の利用目的 0
前面道路:方位  219
前面道路:種類  219
~中略~

行を削除したので、他の項目数にも影響が出ています。

三選.fillna関数で欠損値(NaN)を任意の文字で穴埋めする方法

動作はreplace関数と同じです。対象の項目の属性がcategory型だった場合、fillna関数を使う必要があります。

import pandas as pd

# データを読み込む
df = pd.read_csv('./13101_20201_20204.csv', encoding='cp932')

# fillna未実施の結果を表示する
print(df.isnull().sum())

# '建物の構造'の項目で欠損値(NaN)となっている箇所を'2113'で埋める
df_fillna = df.fillna({'建物の構造': 2113})

# fillna実施の結果を表示する
print(df_fillna.isnull().sum())

実行結果

# fillna未実施の結果
~中略~
延床面積(㎡)  246
建築年      22
建物の構造   18
用途       100
今後の利用目的 15
~中略~

# fillna実施の結果
~中略~
延床面積(㎡)  246
建築年      22
建物の構造    0
用途       100
今後の利用目的 15
~中略~

コメント

タイトルとURLをコピーしました