Pythonデータ分析の前処理でよく使うメソッド（PandasのDataFrameのデータ確認やデータ置換する用）

この記事は、DataFrameとして取り込んだ「データ確認」と「データ変換」で使えるカンニングシートです。

## 必要なライブラリ

```py
import pandas as pd
import seaborn as sns
```

## データの確認

### 特定の行のデータを確認する

```py
# 頭の3行を表示
df.head(3) 

# 最後の4行を表示
df.tail(4) 

# 2,4,6行目を表示
df.loc[[1,3,5]] 

# 4~9行目を表示
df.loc[3:8, :] 

# 条件を指定して合致する行のみを表示する
df[df['currency'] == 'USD'] # currencyカラムがUSDの行のみ抽出して表示。
df[df['cost'] > 30000] # costカラムが30000より大きい行のみ抽出して表示。
df[df['point'].isnull()] # pointカラムがブランクの行のみ抽出して表示。
```

`df[df['カラム名'].isnull()]`はブランクデータの確認に非常に便利。

### 特定の列のデータを確認する

```py
# 指定したカラムを表示。
df[['カラム名']]
df.loc[:, ['カラム名']]
df.iloc[:, [2]] # 3列目のカラムを表示

# 指定した複数カラムを表示。
df[['カラム名','カラム名']]
df.iloc[:, [2,4]] # 3,5列目のカラムを表示
df.iloc[:, 2:5] # 3~5列目のカラムを表示

# 指定したカラムを表示、出力はSeries型
df['カラム名']
df.iloc[:, 2] # 3列目のカラムを表示
```

### 特定のセルのデータを確認する

```py
# DataFrame型で指定のセルを表示
df.loc[[3], ['カラム名']] # 4行目の指定したカラム列のみ表示
df.iloc[[2], [1]] # 3行目の2列目のみ表示

# 指定のセルの値のみ出力
df.loc[3, 'カラム名'] # 4行目の指定したカラム列のみ表示
df.loc[3]['カラム名'] # 4行目の指定したカラム列のみ表示
df.at[3, 'カラム名'] # 4行目の指定したカラム列のみ表示
df.iloc[2,1] # 3行目の2列目のみ表示
df.iat[2,1] # 3行目の2列目のみ表示
```

### 特定の範囲のデータを確認する

```py
# 4行目と6行目のデータの指定したカラム列のみ表示
df.loc[[3,5], ['カラム名','カラム名']] 

# 4~6行目のデータのの指定したカラム列のみ表示
df.loc[3:5, ['カラム名','カラム名']] 

# 3行目と4行目のデータの、2列目と3列目のカラム列のみ表示
df.iloc[[2,3], [1,2]]  

# 3~5行目の2~4列目のカラム列のみ表示
df.iloc[2:5,1:4] 
```

### データ全体の特徴量を確認する

```py
# DataFrameの行数と列数を出力
df.shape 

# 各カラムのデータ数（Null出ないデータ数）とデータタイプを出力
df.info() 

# 各カラムのデータ数、平均、標準偏差、最小、最大、四分位を出力
df.describe() 
```

`df.shape`で調べたレコード行数と、`df.info()`で調べたカラム別のデータ数の差分から、ブランク数とそのカラムを特定するという手法が便利。

### データを視覚的に確認する

```py
# 指定したカラムがカテゴリデータの場合、カテゴリ別データ数の棒グラフを描画できる
sns.countplot('カラム名',data = df) 

# 指定したカラムが連続データの場合、ヒストグラムを描画できる。binsオプションで棒の数を指定できる。
sns.distplot(df['カラム名'], kde = False, bins = 10)

# 指定したカラムが連続データの場合、散布図を描画できる。
sns.stripplot(df['カラム名']) 
```

視覚化して外れ値を探す。

## データの変換

### 行を削除する

```py
# 4行目のデータが削除される
df.drop(3) 

# 4,6,8行目のデータが削除される
df.drop([3,5,7]) 

# どれか一つのカラムでもブランクがあれば、その行が削除される
df.dropna() 

# 全カラムがブランクとなっている行が削除される
df.dropna(how='all') 

# 指定したカラムがブランクの行が削除される
df.dropna(subset=['カラム名']) 

# 指定したカラムのいずれか1つでもブランクの行が削除される
df.dropna(subset=['カラム名', 'カラム名']) 
```

### 列を削除する

```py
# 指定したカラムが削除される
df.drop('カラム名', axis=1) 

# 指定した複数カラムが削除される
df.drop(['カラム名','カラム名'], axis=1) 
```

### 列名を変える

```py
df.rename(columns={'変更前カラム名1': '変更後カラム名1', '変更前カラム名2': '変更後カラム名2'})
```

### ブランクに値を投入する

```py
# すべてのブランクに0を投入する
df.fillna(0) 

# 指定したカラムのブランクに0を投入する
df['カラム名'].fillna(0) 

# ブランクに投入する値をカラムごとに指定する
df.fillna({'カラム名': 0, 'カラム名': 100, 'カラム名': 'BLANK'}) 

# ブランクセルの一つ上のセルの値をブランクに投入する
df.fillna(method='ffill') 

# ブランクセルの一つ下のセルの値をブランクに投入する
df.fillna(method='bfill') 
```

### データの値変更

```py
# BLANKという文字列を0に変更する
df.replace('BLANK', 0) 

# MaleをMに、BLANKという文字列を0に変更する
df.replace({'Male': 'M', 'BLANK': 0}) 
df.replace(['Male', 'BLANK'], ['M', 0]) 

# BLANKという文字列と、無しという文字列を0に変更する
df.replace(['BLANK', '無し'], 0) 

# 指定したカラムでのみBLANKという文字列を0に変更する
df.replace({'カラム名': {'BLANK': 0}}) 

# カラム別に変換を定義する
df.replace({'カラム名': {'BLANK': 0, '無し': 0}, 'カラム名': {'Male': 'M'}}) 
```

## 補足
データの変換は再代入かinplace=Trueを指定する

```py
# 以下の実行してもdfは変化しない
df.drop([3,5,7])
df.replace('BLANK', 0)
df.fillna(0)

# 以下を実行するとdfは変化する
df = df.drop([3,5,7])
df = df.replace('BLANK', 0)
df = df.fillna(0)
df.drop([3,5,7], inplace=True)
df.replace('BLANK', 0, inplace=True)
df.fillna(0, inplace=True)
```



## さいごに（私が制作したコンテンツの紹介）

私が制作したものですが、分析の中で実際に前処理をどうやって行くかという視点で参考になります。有料だけど、前処理部分は無料で見れます。

https://www.techpit.jp/courses/30/curriculums/31/sections/264/parts/906