pandas入門 – 欠損値の確認、削除、補完

概要

データ分析はデータクレンジングに8割の時間を要すると言われます。欠損値の扱いはデータ分析を行う上で重要なファーストステップとなります。

欠損値とは、何らかの理由でデータの一部が抜け落ちている状態です。欠損値があると予測モデル作成時に欠損値が影響してうまく学習できないなどの不都合が発生する可能性があります。

ここでは、padasにおける欠損値の確認方法、欠損値を含むデータの削除方法、欠損値の補完方法の基礎を紹介します。

欠損値の確認

まずは欠損値を含むデータの確認方法について確認します。欠損値を確認するにはisnull()を利用します。isnull()ではDataFrameの要素で値が欠損していればTrue、欠損していなければFalseを返します。

df = pd.DataFrame({
    'id': [1, 2, 3, 4, 5, 6 ,7],
    'name': ['taro', 'takuya', 'erika', 'hanako', 'jiro', 'goro', 'rika'],
    'age': [20, 25, 18, 25, 25, 18, 19],
    'sex': ['male', 'male', 'female', 'female', 'male', None, 'female'],
    'height': [170, 180, 160, 165, 190, 172, None]
})

df.isnull()

# 	id	name	age	sex	height
# 0	False	False	False	False	False
# 1	False	False	False	False	False
# 2	False	False	False	False	False
# 3	False	False	False	False	False
# 4	False	False	False	False	False
# 5	False	False	False	True	False
# 6	False	False	False	False	True

欠損値の件数を集計

列ごとの欠損値の件数を集計するにはisunullsum()を利用します。

df.isnull().sum()

# id        0
# name      0
# age       0
# sex       1
# height    1
# dtype: int64

欠損値を含むレコードを削除

欠損値を持つレコードを削除するにはdropna()を利用します。以下の例では欠損値を含む6行目と7行目が削除されます。

df.dropna()

#	id	name	age	sex	height
# 0	1	taro	20	male	170.0
# 1	2	takuya	25	male	180.0
# 2	3	erika	18	female	160.0
# 3	4	hanako	25	female	165.0
# 4	5	jiro	25	male	190.0

欠損値を含むレコードのみ抽出

続いて、欠損値を持つ列が一つでもあるレコードを抽出します。先を行うにはisnull()any()を利用します。まずは欠損値を含むレコードを判定する処理を見てみましょう。

df.isnull().any(axis=1)

# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5     True
# 6     True

上記を実行すると欠損値を持つ列が一つでもあるレコードがTrueとなっております。今回の例では、6行目と7行目がTrueとなっております。

続いて上記の結果を条件にDataFrameから欠損値を持つ列が一つでもあるレコードを抽出します。

df[df.isnull().any(axis=1)]

# 	id	name	age	sex	height
# 5	6	goro	18	None	172.0
# 6	7	rika	19	female	NaN

欠損値の補完

欠損値の補完するもっとも簡単な方法はfillna()を利用することです。

まずは共通の値で一律に値を補完する方法を紹介します。以下の例では6行目と7行目の欠損値が0で補完されます。

df.fillna(0)

# 	id	name	age	sex	height
# 0	1	taro	20	male	170.0
# 1	2	takuya	25	male	180.0
# 2	3	erika	18	female	160.0
# 3	4	hanako	25	female	165.0
# 4	5	jiro	25	male	190.0
# 5	6	goro	18	0	172.0
# 6	7	rika	19	female	0.

続いて、列ごとに欠損値の値を指定して補完する方法を紹介します。以下の例ではsexの欠損値にmale、heightの欠損値に0を指定して補完をおこないます。fillna()の引数にはdictionary型で列名と値を渡します。

df.fillna({'sex': 'male', 'height': '0'})

# 	id	name	age	sex	height
# 0	1	taro	20	male	170
# 1	2	takuya	25	male	180
# 2	3	erika	18	female	160
# 3	4	hanako	25	female	165
# 4	5	jiro	25	male	190
# 5	6	goro	18	male	172
# 6	7	rika	19	female	0

まとめ

今回は、pandasにおける欠損値の確認、削除、補完について基礎的な方法をご紹介しました。データ分析はデータクレンジングに8割の時間を要すると言われており、欠損値の扱いは非常に重要となります。データの特性に応じて、欠損値を含むレコードを削除したり、最大値、最小値、平均値などで補完するなど様々な対応が考えられます。欠損値の扱いについてはしっかり慣れるようにしましょう。