結論
- 一選.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
~中略~
コメント