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> 趣味 Trueany() と組み合わせることで、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: int64NaNの取り扱いを決める
次に実際に 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 をうまく取り扱えるようになりましょう!
