PandasでNaNの列を処理する

PandasでNaNの列を処理する
Page content

Pandas でデータを扱うことで、データ分析の前処理が格段に楽になります。

列データにおける NaN の処理を例に、Pandasの便利さの説明をしたいと思います。

NaNとは

NaN(Not a Number) は浮動小数点型における異常な値のことを意味します。 わかりやすい例で言うと、0での割り算が該当します。これは実数では表せないため、 NaN になります。

Pandas において NaN値が欠損している 場合によく遭遇する表現です。 具体例で見ていきましょう。以下のようなサンプルデータ(sample.csv)を作成します。

1ID,名前,年齢,性別,趣味
21,小林,20,男,野球観戦
32,田中,35,女,飲み会
43,佐藤,29,男
54,鈴木,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 をうまく取り扱えるようになりましょう!

関連記事

soudegesu avatar
About soudegesu
Software Engineer
comments powered by Disqus