PandasでNaNの列を処理する
Pandas でデータを扱うことで、データ分析の前処理が格段に楽になります。
列データにおける NaN
の処理を例に、Pandasの便利さの説明をしたいと思います。
NaNとは
NaN(Not a Number) は浮動小数点型における異常な値のことを意味します。
わかりやすい例で言うと、0での割り算が該当します。これは実数では表せないため、 NaN
になります。
Pandas において NaN
は 値が欠損している 場合によく遭遇する表現です。
具体例で見ていきましょう。以下のようなサンプルデータ(sample.csv
)を作成します。
ID,名前,年齢,性別,趣味
1,小林,20,男,野球観戦
2,田中,35,女,飲み会
3,佐藤,29,男
4,鈴木,44,女,編み物
データを read_csv
関数で読み出して DataFrame
とした後、表示してみます。
1import pandas as pd
2
3df = pd.read_csv('./sample.csv')
4df.head()
佐藤さんは 趣味 の列のデータが欠損しているので NaN
と表示されていますね。
ID | 名前 | 年齢 | 性別 | 趣味 | |
---|---|---|---|---|---|
0 | 1 | 小林 | 20 | 男 | 野球観戦 |
1 | 2 | 田中 | 35 | 女 | 飲み会 |
2 | 3 | 佐藤 | 29 | 男 | NaN |
3 | 4 | 鈴木 | 44 | 女 | 編み物 |
例えば、必須回答 と 任意回答 の項目があるアンケート分析の場面においては、任意回答項目の列に NaN
が頻出することは想像に難くないでしょう。
要件に応じて欠損値を正しく処理するのは、とても重要な作業です。
各列にNaNが存在するかを確認する
ここから、 NaN
のハンドリグをまとめていきます。
まずは、各列の中に NaN
があるかをパッと判断できると嬉しいでしょう。isna
関数を使えば簡単に確認できます。
1df.isna().any()
2
3> ID False
4> 名前 False
5> 年齢 False
6> 性別 False
7> 趣味 True
any()
と組み合わせることで、1つでもNaNがあればTrue と出力指定ができます。
上の出力で言えば、趣味 のカラムは1つ以上欠損しているので True
です。
df.isna().all()
としてしまうと、 全ての値がNaNであればTrue となってしまうので、注意しましょう。
各列にNaNが何件あるかを確認する
NaN
の件数を集計したい場合には sum()
を使えば良いです。
1df.isna().sum()
2
3> ID 0
4> 名前 0
5> 年齢 0
6> 性別 0
7> 趣味 1
8> dtype: int64
NaNの取り扱いを決める
次に実際に NaN
となっているデータの取扱いを考えます。
NaNが存在する行を削除する
以下は、全ての列に対して1つでも NaN
がある 行 を削除する例です。
1df[df.isna().any(axis=1) == False]
axis=1
とすることで、行に対する True/False
を取得している点が肝になります。
False
となっている行、つまり、 NaN
が存在しない行のみ表示しています。
これは dropna
関数を使った時の以下の処理と等価です。
1df.dropna(axis=0)
しかし実際問題、 全ての列においてNaN判定をする処理はあまり見かけないので、 特定の列がNaNの行を削除 する場合には以下のようにします。
1# ここでは「趣味」列を対象にする
2df[df['趣味'].isna() == False]
NaNに対してデフォルト値を設定する
NaN
のデータに対してデフォルト値を設定するには fillna
関数を使います。
1df.fillna('なし')
全ての NaN
のデータを なし
に置換することができます。
ID | 名前 | 年齢 | 性別 | 趣味 | |
---|---|---|---|---|---|
0 | 1 | 小林 | 20 | 男 | 野球観戦 |
1 | 2 | 田中 | 35 | 女 | 飲み会 |
2 | 3 | 佐藤 | 29 | 男 | なし |
3 | 4 | 鈴木 | 44 | 女 | 編み物 |
列ごとにデフォルト値を変えたい場合には、引数に辞書型を渡してあげると良いです。
1# 「趣味」列がNaNであれば「なし」をデフォルト値とする
2df.fillna({'趣味': 'なし'})
ID | 名前 | 年齢 | 性別 | 趣味 | |
---|---|---|---|---|---|
0 | 1 | 小林 | 20 | 男 | 野球観戦 |
1 | 2 | 田中 | 35 | 女 | 飲み会 |
2 | 3 | 佐藤 | 29 | 男 | なし |
3 | 4 | 鈴木 | 44 | 女 | 編み物 |
まとめ
Pandas を使うことで、欠損値のある行や列に対して、削除を行ったり、デフォルト値を追加したり、処理を行うことができます。
分析対象データの目的に応じて、NaN
をうまく取り扱えるようになりましょう!