【Python前処理】欠損値の処理メソッドまとめ【元データをスッキリ】

pythonLOGO

csvデータを取り込んだ後、データの中身を整理する時(前処理)に使う便利なメソッドをまとめてます。

メソッド、メソッド引数まとめ

メソッド
  • dropna
  • 指定した軸について、その軸のラベルの値に欠損値が含まれる場合は、ラベルごと削除する。削除する欠損値ラベルについて、閾値で指定可能。

  • fillna
  • 欠損値を指定した値で穴埋めする。
    ffill、bfillなどの指定した方法で穴埋めする。

  • isnull
  • 各値が欠損値(NA)であるかどうかを示す、真偽値を戻す。

  • notisnull
  • isnullの反対の動作をする。

メソッドの引数
  • value
  • 欠損値の穴埋めに使われるスカラー値。

  • method
  • 穴埋め方法を指定する。デフォルトではffill。

  • axis
  • 穴埋めしたい軸、デフォルトではaxis=0(行方向)。

  • inplace
  • コピーを作るのではなく、呼び出し元のオブジェクトを直接変更。

  • limit
  • 前方(method=’ffill’)、後方(method=’bfill’)への穴埋め時に、
    連続した穴埋めを最大何回まで行うか指定する

欠損値の削除 dropna

import numpy as np
import pandas as pd
from numpy import nan as NA

data = pd.Series([1, NA, 3.5, NA, 7])
data

# 0    1.0
# 1    NaN
# 2    3.5
# 3    NaN
# 4    7.0
# dtype: float64

Serieseの場合

# Serieseの場合
data.dropna()

# 0    1.0
# 2    3.5
# 4    7.0
# dtype: float64

# 同じ方法
data[data.notnull()]

# 0    1.0
# 2    3.5
# 4    7.0
# dtype: float64

DataFrameの場合

# DataFrameの場合
data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],
                     [NA, NA, NA], [NA, 6.5, 3.]])
data

# 1 1.0	6.5	3.0
# 2 1.0	NaN	NaN
# 3 NaN	NaN	NaN
# 4 NaN	6.5	3.0
cleaned = data.dropna()
cleaned

# 0	1.0	6.5	3.0

how=’all’を指定すると、全ての行が欠損値である行のみ削除される

# how='all'を指定すると、全ての行が欠損値である行のみ削除される

data.dropna(how='all')

# 0	1.0	6.5	3.0
# 1	1.0	NaN	NaN
# 3	NaN	6.5	3.0

列の削除を行う場合は、axis=1を指定する

# 列の削除を行う場合は、axis=1を指定する

data[4] = NA # 4列目にNanの列を作成
data

# 0	1.0	6.5	3.0	NaN
# 1	1.0	NaN	NaN	NaN
# 2	NaN	NaN	NaN	NaN
# 3	NaN	6.5	3.0	NaN
data.dropna(axis=1, how='all')

# 0	1.0	6.5	3.0
# 1	1.0	NaN	NaN
# 2	NaN	NaN	NaN
# 3	NaN	6.5	3.0

一定数の行を除外する場合は、threshを使う

# 一定数の行を除外する場合は、threshを使う
# (時系列データでよく使う)

df = pd.DataFrame(np.random.randn(7, 3))
df.iloc[:4, 1] = NA
df.iloc[:2, 2] = NA
df

# 0	-0.273576	     NaN	      NaN
# 1	-1.824529	     NaN	      NaN
# 2	-0.596045	     NaN	-0.280421
# 3  2.837498	     NaN	-1.643616
# 4	 0.164265	1.337977	-1.005163
# 5	 0.173674	0.803977	-0.640646
# 6	-0.227646	1.405479	 0.940827
df.dropna()

# 4	0.164265	1.337977	-1.005163
# 5	0.173674	0.803977	-0.640646
# 6	-0.227646	1.405479	0.940827
df.dropna(thresh=2)

# 2	-0.596045	     NaN	-0.280421
# 3	 2.837498    	 NaN	-1.643616
# 4	 0.164265	1.337977	-1.005163
# 5	 0.173674	0.803977	-0.640646
# 6	-0.227646	1.405479   0.940827

欠損値を穴埋めする fillna

# 上記のdfを使う

df.fillna(0) # 時系列で無いデータの場合平均値で埋める場合が多い

# 0	-0.273576	0.000000	 0.000000
# 1	-1.824529	0.000000	 0.000000
# 2	-0.596045	0.000000	-0.280421
# 3	 2.837498	0.000000	-1.643616
# 4	 0.164265	1.337977	-1.005163
# 5	 0.173674	0.803977	-0.640646
# 6	-0.227646	1.405479	 0.940827

fillnaメソッドで列ごとに値を指定する

# fillnaメソッドにディクショナリを与えると、
# 列ごとに異なった値で埋める事もできる。

df.fillna({1: 0.5, 2: 0})

# 0	-0.273576	0.500000 	 0.000000
# 1	-1.824529	0.500000	 0.000000
# 2	-0.596045	0.500000	-0.280421
# 3	 2.837498	0.500000	-1.643616
# 4	 0.164265	1.337977	-1.005163
# 5	 0.173674	0.803977	-0.640646
# 6	-0.227646	1.405479	 0.940827

既存のオブジェクトを直接変更する場合

# 既存のオブジェクトを直接変更する場合

_ = df.fillna(0, inplace=True)
df

# 0	-0.273576	0.000000	 0.000000
# 1	-1.824529	0.000000	 0.000000
# 2	-0.596045	0.000000	-0.280421
# 3	 2.837498	0.000000	-1.643616
# 4	 0.164265	1.337977	-1.005163
# 5	 0.173674	0.803977	-0.640646
# 6	-0.227646	1.405479	 0.940827
df = pd.DataFrame(np.random.randn(6, 3))
df

# 0	-1.174053	 0.877008	 0.757160
# 1	-0.691133	-1.313615	-0.543499
# 2	 0.322590	 0.271285	 0.950885
# 3	 0.842171	-1.697478	-0.560652
# 4	 1.158943	 0.138047	 2.055909
# 5	 1.904791	-1.028752	 0.747728

最終行の数字で穴埋めする場合、ffillを使う

# 最終行の数字で穴埋めする場合、ffillを使う

df = pd.DataFrame(np.random.randn(6, 3))
df.iloc[2:, 1] = NA
df.iloc[4:, 2] = NA
df

# 0	 2.326546	 0.720085	-0.024731
# 1	-0.297594	-0.335980	 0.061773
# 2	 0.710080	      NaN	 1.137681
# 3	 0.028826	      NaN	 0.192786
# 4	-2.202417	      NaN	      NaN
# 5	 1.218762	      NaN	      NaN
df.fillna(method='ffill')

# 0	 2.326546	 0.720085	-0.024731
# 1	-0.297594	-0.335980	 0.061773
# 2	 0.710080	-0.335980	 1.137681
# 3	 0.028826	-0.335980	 0.192786
# 4	-2.202417	-0.335980	 0.192786
# 5	 1.218762	-0.335980	 0.192786

範囲を限定的にしたい時は、limitを使う

# 範囲を限定的にしたい時は、limitを使う

df.fillna(method='ffill', limit=2)

# 0	 2.326546	 0.720085	-0.024731
# 1	-0.297594	-0.335980	 0.061773
# 2	 0.710080	-0.335980	 1.137681
# 3	 0.028826	-0.335980	 0.192786
# 4	-2.202417	      NaN	 0.192786
# 5	 1.218762	      NaN	 0.192786



 

あ、宜しければ・・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です