■ はじめに
https://dk521123.hatenablog.com/entry/2019/10/22/014957
の続き。 データ解析をする際に、Pandas で 欠損データやデータのクレンジングの扱い方をメモする。
目次
【1】 欠損データの確認 【2】 欠損データを削除 【3】 欠損データをほかの値で補う 【4】 データの種類の確認 【5】 データの種類のまとめる 【6】不要な項目を削除する
【1】 欠損データの確認
* pd.notna() で判定できる
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.notna.html
* data_frame.isnull().sum() で確認できる
サンプル
例1:pd.notna()
import pandas as pd import numpy as np print('Result-01 : {}'.format(pd.notna(None))) print('Result-02 : {}'.format(pd.notna(np.nan))) print('Result-03 : {}'.format(pd.notna(1))) print('Result-04 : {}'.format(pd.notna('Hello')))
出力結果
Result-01 : False Result-02 : False Result-03 : True Result-04 : True
例2:data_frame.isnull().sum()
import pandas as pd # データは以下の関連記事と同じ # https://dk521123.hatenablog.com/entry/2020/03/18/223033 data_frame = pd.read_csv('https://raw.githubusercontent.com/madmashup/targeted-marketing-predictive-engine/master/banking.csv', header=0) print(data.isnull().sum())
出力結果
# 欠損値なし age 0 job 0 marital 0 education 0 default 0 housing 0 loan 0 contact 0 month 0 day_of_week 0 duration 0 campaign 0 pdays 0 previous 0 poutcome 0 emp_var_rate 0 cons_price_idx 0 cons_conf_idx 0 euribor3m 0 nr_employed 0 y 0 dtype: int64
【2】 欠損データを削除
data_frame.dropna() で行える
サンプル
https://dk521123.hatenablog.com/entry/2020/04/04/021413
# より抜粋 # 欠損値処理(削除) df_test = df_test.dropna(subset=['Fare']) df_test = df_test.dropna(subset=['Age']) df_test = df_test.dropna(subset=['Embarked'])
【3】 欠損データをほかの値で補う
data_frame.fillna() で行える
サンプル
https://dk521123.hatenablog.com/entry/2020/04/04/021413
# より抜粋 # 欠損値処理 df_train['Fare'] = df_train['Fare'].fillna(df_train['Fare'].median()) df_train['Age'] = df_train['Age'].fillna(df_train['Age'].median()) df_train['Embarked'] = df_train['Embarked'].fillna('S')
【4】 データの種類の確認
data_frame['item'].unique() で行える
サンプル
import pandas as pd # データは以下の関連記事と同じ # https://dk521123.hatenablog.com/entry/2020/03/18/223033 data_frame = pd.read_csv('https://raw.githubusercontent.com/madmashup/targeted-marketing-predictive-engine/master/banking.csv', header=0) print(data_frame['education'].unique())
出力結果
['basic.4y' 'unknown' 'university.degree' 'high.school' 'basic.9y' 'professional.course' 'basic.6y' 'illiterate']
【5】 データの種類のまとめる
np.where()で行える
構文
data_frame['item'] = np.where( data_frame['item'] == '<まとめる前の値>', '<まとめる後の値>', data_frame['item'])
サンプル
# 「■ データの種類の確認」のサンプルと同じなので省略 # 'basic.9y'/'basic.6y'/'basic.4y' => 'Basic'にまとめる data_frame['education'] = np.where( data_frame['education'] == 'basic.9y', 'Basic', data_frame['education']) data_frame['education'] = np.where( data_frame['education'] == 'basic.6y', 'Basic', data_frame['education']) data_frame['education'] = np.where( data_frame['education'] == 'basic.4y', 'Basic', data_frame['education']) print(data_frame['education'].unique())
出力結果
['basic.4y' 'unknown' 'university.degree' 'high.school' 'basic.9y' 'professional.course' 'basic.6y' 'illiterate'] ['Basic' 'unknown' 'university.degree' 'high.school' 'professional.course' 'illiterate']
【6】不要な項目を削除する
data_frame.drop()で行える
構文
data_frame = data_frame.drop(columns=['不要な項目1', ...])
サンプル
import pandas as pd import io csv_header = ["no", "name", "remarks", "birth_date", "update_date"] csv_data1 = """ 1,Mike,hello,1988-11-11,2021-01-01 2,Smith,World,1978-12-12,2021-07-11 3,Tom,!!!,2000-12-16,2021-04-21 """ data_frame = pd.read_csv( io.StringIO(csv_data1), sep=',', header=None, names=csv_header) print(data_frame) print("************") data_frame = data_frame.drop(columns=["birth_date", "update_date"]) print(data_frame)
出力結果
no name remarks birth_date update_date 0 1 Mike hello 1988-11-11 2021-01-01 1 2 Smith World 1978-12-12 2021-07-11 2 3 Tom !!! 2000-12-16 2021-04-21 ************ no name remarks 0 1 Mike hello 1 2 Smith World 2 3 Tom !!!
参考文献
関連記事
Pandas ~入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/22/014957
Pandas ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/10/14/000000
Amazon SageMaker ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/03/18/223033
Matplotlib ~ グラフ描画ライブラリ ~
https://dk521123.hatenablog.com/entry/2020/03/01/000000