pandasで欠損値NaNを削除、置換(最小、平均、最大)する
医療用データの未検査項目やアンケート調査データの無回答項目のように、欠損値が存在するデータは多数存在します。機械学習を行う上でも欠損値が全くないというデータはまねで何かしらの項目には欠損値が存在することがよくあります。それではその欠損値はどのようにしたらいいのでしょうか?簡単なケースとしては欠損値が入っているデータそのものを削除するという方法があります。または欠損値のデータを何かしらの値で置き換えるという方法もあります。
今回は欠損値についての対処方法について説明します。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#各種ライブラリのインポート import numpy as np import pandas as pd import matplotlib.pyplot as plt #%matplotlib inline #欠損値が入っているデータフレームの作成 df = pd.DataFrame({'a':[1.0,2.0,3.0,4.0,5.0],'b':[11,np.nan,13,14,15],'c':[21,22,np.nan,24,25],'d':[31,32,33,np.nan,35],'e':[41,42,43,44,np.nan]}) df #欠損値を確認する(False:欠損以外、True:欠損) df.isnull() #欠損値を確認する(False:欠損以外、True:欠損)(列指定) df['e'].isnull() #どこかに欠損値が一つ以上入っている行を削除する df.dropna(how='any',axis=0) #どこかに欠損値が一つ以上入っている例を削除する df.dropna(how='any',axis=1) #欠損値を0で置き換える df.fillna(0) #欠損値を最小値で置き換える df.fillna(df.min()) #欠損値を平均で置き換える df.fillna(df.mean()) #欠損値を最大値で置き換える df.fillna(df.max()) |
ソースコードの詳細
各種ライブラリのインポート
1 2 3 4 5 |
#各種ライブラリのインポート import numpy as np import pandas as pd import matplotlib.pyplot as plt #%matplotlib inline |
欠損値が入っているデータフレームの作成
1 2 3 |
#欠損値が入っているデータフレームの作成 df = pd.DataFrame({'a':[1.0,2.0,3.0,4.0,5.0],'b':[11,np.nan,13,14,15],'c':[21,22,np.nan,24,25],'d':[31,32,33,np.nan,35],'e':[41,42,43,44,np.nan]}) df |

今回のお試し用として欠損値のデータを作成しています。5×5の表を作成し一部のデータに対して欠損値のデータを作成しています。欠損値はnp.nanを指定することで作成することができます。欠損値は"NaN"という文字で表現されています。
欠損値を確認する(False:欠損以外、True:欠損)
1 2 |
#欠損値を確認する(False:欠損以外、True:欠損) df.isnull() |

先ほどの表でも欠損値を確認することができますが、欠損値があるかどうかをTrue,Falseの形式で見ることもできます。isnull関数を使用することで、欠損値だった場合はTrue,欠損値ではない場合はFalseが返却されます。
欠損値を確認する(False:欠損以外、True:欠損)(列指定)
1 2 |
#欠損値を確認する(False:欠損以外、True:欠損)(列指定) df['e'].isnull() |
1 2 3 4 5 6 |
0 False 1 False 2 False 3 False 4 True Name: e, dtype: bool |
どこかに欠損値が一つ以上入っている行を削除する
1 2 |
#どこかに欠損値が一つ以上入っている行を削除する df.dropna(how='any',axis=0) |

dropnaを指定することで、欠損値が入っている行、または列全体を削除することができます。dropnaの引数として,axis=0(行指定)、how='any'(どれか)を指定しています。この意味は行のどれかに欠損値が入っていたら削除するという意味となります。
どこかに欠損値が一つ以上入っている例を削除する
1 2 |
#どこかに欠損値が一つ以上入っている例を削除する df.dropna(how='any',axis=1) |

dropnaを指定することで、欠損値が入っている行、または列全体を削除することができます。dropnaの引数として,axis=1(列指定)、how='any'(どれか)を指定しています。この意味は列のどれかに欠損値が入っていたら削除するという意味となります。
欠損値を0で置き換える
1 2 |
#欠損値を0で置き換える df.fillna(0) |

欠損値を削除するのではなく、何かしらの値で置き換えることにします。fillna関数を使用することで欠損値を置き換えることができます。ここでは0を指定しているため欠損値は0で置き換えられることになります。
欠損値を最小値で置き換える
1 2 |
#欠損値を最小値で置き換える df.fillna(df.min()) |

同様に最小値で置き換えてみましょう。min関数を使用することで最小値に置き換えることができます。
欠損値を平均で置き換える
1 2 |
#欠損値を平均で置き換える df.fillna(df.mean()) |

同様に平均値で置き換えてみましょう。mean関数を使用することで平均値に置き換えることができます。
欠損値を最大値で置き換える
1 2 |
#欠損値を最大値で置き換える df.fillna(df.max()) |

同様に最大値で置き換えてみましょう。max関数を使用することで最大値に置き換えることができます。