【Python】Pandas ~ 基本編 / データのクレンジング ~

■ はじめに

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     !!!

参考文献

http://www.kazutak.com/index.php/2018/06/02/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E5%9B%9E%E5%B8%B0%E3%81%A7%E5%84%AA%E8%89%AF%E9%A1%A7%E5%AE%A2%E3%82%92%E5%88%A4%E5%88%A5%E3%81%99%E3%82%8B/

関連記事

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