pythonのpandasを使用して、データ分析のために前処理を行うことがあります
前処理を行うことでデータの質を高めることができ、より良い結果を得ることができます
そのため、データ分析の約8割は前処理で決定されるといっても過言ではありません
今回の記事では、pandasを使用したデータ分析でできることについて解説していきたいと思います
pythonのpandasでデータ分析をしたいけど、何ができるのか知りたい
pythonのpandasでデータ分析を行う流れを、ざっくりと知りたい
こんな疑問にお答えします
pandasについて理解ができたら、実際にデータ分析・機械学習を実装していきましょう
Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップ
Pythonで機械学習に学んで実装してみよう【サンプルコードあり】
Contents
pandasの初期設定
まずはpandasを使用するための初期設定を行なっていきます
pandasを使うには、Anacondaの利用が便利です
Anacondaのインストール
Anacondaのインストールは簡単に行うことができるので、以下の記事を見つつ、進めていけばOKです

ライブラリのインポート
Anacondaのインストールが完了したら、コードを打っていきます
pandasのライブラリをインポートするのは、以下のコード
import pandas as pd
「as」というのは、pandasを「pd」という名称で使いますよ、というおまじないです
これでpythonでpandasを使用することが可能です
データ分析を行うデータの読み込み
pandasを使用する準備ができたら、データを読み込んでいきます
今回は3種類のデータについて読み込み方法を解説します
csvファイル
pandasでcsvファイルを読み込む場合には、「read_csv」を使用します
import pandas as pd
#csvファイルの読み込み.csvファイルは該当ファイルのパス名をコピペすればOK
file=pd.read_csv("XXXXX.csv")
read_csvのオプションは以下です
引数 | 説明 |
encoding==’cp932またはUTF-8′ | セルに日本語が含まれている場合、必須 |
header=None | 先頭行をカラムとして取り込みたくないときに使う |
dtype=’object’ | すべてのセルを『文字列』として取り込む |
names=’リストまたはタプル’ | 任意のカラム名を設定する |
sep=’\t’ | TXTファイルを読み込む |
「sep=’\t’」を入力すれば、txtファイルを読み込むこともできます
excelファイル
excelのファイルを読み込む場合には、read_excelを使用します
import pandas as pd
#excelファイルの読み込み.excelファイルは該当ファイルのパス名をコピペすればOK
file=pd.read_excel("XXXXX.xlx",sheet_name='シート名')
googleスプレッドシート
googleスプレッドシートで読み込むのは、やや煩雑ですが、以下でできます
import json
import gspread # pip install gspread
from oauth2client.service_account import ServiceAccountCredentials # pip install oauth2client
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('秘密鍵のJSONファイルのdirパス', scope)
gc = gspread.authorize(credentials)
SPREADSHEET_KEY = 'スプレッドシートキー'
worksheet = gc.open_by_key(SPREADSHEET_KEY).worksheet('ワークシート名')
df = pd.DataFrame(worksheet.get_all_values())
できるならば、あらかじめエクスポートしてから、csvファイルとして読み込むのがおすすめです
読み込んだデータの確認
ここからは読み込んだデータを確認していく作業を行なっていきます
今回はseabornに入っている、irisのデータを使用して、解説していきたいと思います
以下のコードでirisのデータをインポートすることができます
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
データのチェック
irisのデータがインポートされているかを確認します
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
print(iris)
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
[150 rows x 5 columns]
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#先頭5行を出力
print(iris.head())
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#最後から5行を出力
print(iris.tail())
>>>出力結果
sepal_length sepal_width petal_length petal_width species
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
欠損値の確認・処理
pandasを使って欠損値を確認するには、「.isnull」を使用します
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#データの欠損値を確認する
print(iris.isnull())
>>>出力結果
sepal_length sepal_width petal_length petal_width species
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
.. ... ... ... ... ...
145 False False False False False
146 False False False False False
147 False False False False False
148 False False False False False
149 False False False False False
[150 rows x 5 columns]
上記コードでは見にくいので、まとめていきます
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#欠損値をカラム名ごとにまとめて表示
print(iris.isnull().sum())
>>>出力結果
sepal_length 0
sepal_width 0
petal_length 0
petal_width 0
species 0
dtype: int64
今回のirisのデータでは、欠損値がないことがわかりました
欠損値が含まれていた場合には、以下のコードで対応していきます
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
# 欠損値がひとつでも含まれている行を削除する
iris.dropna()
# ある行のすべての値が欠損していたら、その行を削除する
iris.dropna(subset=['列名'], how='all')
# すべての欠損値を0で置換する
iris.fillna(0)
基本的な分析
データの中身、欠損値の確認までできたので、次はデータ構成を確認していきます
データ構成の確認
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#データ構成を確認
print(iris.info())
>>>出力結果
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal_length 150 non-null float64
1 sepal_width 150 non-null float64
2 petal_length 150 non-null float64
3 petal_width 150 non-null float64
4 species 150 non-null object
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
データサイズの確認
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#行数と列数を確認
print(iris.shape)
>>>出力結果
(150, 5)
#行数だけ確認
print(len(iris))
>>>出力結果
150
#列数だけ確認
print(len(iris.columns))
>>>出力結果
5
データの行名と列名を確認
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#インデックスの確認
print(iris.index)
>>>出力結果
RangeIndex(start=0, stop=150, step=1)
#カラム名の確認
print(iris.columns)
>>>出力結果
Index(['sepal_length', 'sepal_width', 'petal_length', 'petal_width',
'species'],
dtype='object')
各列のデータの型を確認
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#DataFrameのデータ型を確認
print(iris.dtypes)
>>>出力結果
sepal_length float64
sepal_width float64
petal_length float64
petal_width float64
species object
dtype: object
列で重複を含まない値を確認する(ユニークの確認)
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#重複を含まない値を確認
print(iris['sepal_length'].unique())
>>>出力結果
[5.1 4.9 4.7 4.6 5. 5.4 4.4 4.8 4.3 5.8 5.7 5.2 5.5 4.5 5.3 7. 6.4 6.9
6.5 6.3 6.6 5.9 6. 6.1 5.6 6.7 6.2 6.8 7.1 7.6 7.3 7.2 7.7 7.4 7.9]
各列のユニークな値の出現頻度を確認
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#出現頻度の確認
print(iris['sepal_length'].value_counts())
>>>出力結果
5.0 10
6.3 9
5.1 9
5.7 8
6.7 8
5.8 7
5.5 7
6.4 7
4.9 6
6.0 6
5.4 6
5.6 6
6.1 6
6.5 5
4.8 5
6.2 4
5.2 4
7.7 4
6.9 4
4.6 4
7.2 3
5.9 3
4.4 3
6.8 3
6.6 2
4.7 2
7.1 1
7.4 1
7.6 1
7.9 1
4.5 1
7.0 1
5.3 1
7.3 1
4.3 1
Name: sepal_length, dtype: int64
読み込んだファイルの要約統計量を算出する
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#出現頻度の確認
print(iris.describe())
>>>出力結果
sepal_length sepal_width petal_length petal_width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.057333 3.758000 1.199333
std 0.828066 0.435866 1.765298 0.762238
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
これで最大値や最小値、平均値などを一気に算出することが可能です
データの可視化
ここからはデータの可視化をしていきたいと思います
データの可視化はmatplotlibやseaborn、plotlyなどを使用すれば行うことができます
seabornが見た目が綺麗に可視化できるので、seabornを使用して解説をしていきたいと思います
import pandas as pd
#seabornで可視化を行う
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
基本的にはseabornをインポートすれば、可視化を行うことができます
seabornを使用した可視化の詳細は以下の記事を参考にしてください

seabornを使用して、こんな感じの可視化を行なっていきます
データの選択・抽出
ここからは、特定のデータを選択・抽出する方法について解説をしていきたいと思います
直接指定
単一のデータを選択する
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#単一のデータを選択する
print(iris['sepal_length'])
>>>出力結果
0 5.1
1 4.9
2 4.7
3 4.6
4 5.0
145 6.7
146 6.3
147 6.5
148 6.2
149 5.9
Name: sepal_length, Length: 150, dtype: float64
複数のデータを選択する
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#複数のデータを選択する
print(iris[['sepal_length','sepal_width']])
>>>出力結果
sepal_length sepal_width
0 5.1 3.5
1 4.9 3.0
2 4.7 3.2
3 4.6 3.1
4 5.0 3.6
.. ... ...
145 6.7 3.0
146 6.3 2.5
147 6.5 3.0
148 6.2 3.4
149 5.9 3.0
[150 rows x 2 columns]
条件指定
条件指定では、pandasのquery()を使用していきます
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#sepal_lengthで5.1のデータだけを抽出
print(iris.query('sepal_length == 5.1'))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
17 5.1 3.5 1.4 0.3 setosa
19 5.1 3.8 1.5 0.3 setosa
21 5.1 3.7 1.5 0.4 setosa
23 5.1 3.3 1.7 0.5 setosa
39 5.1 3.4 1.5 0.2 setosa
44 5.1 3.8 1.9 0.4 setosa
46 5.1 3.8 1.6 0.2 setosa
98 5.1 2.5 3.0 1.1 versicolor
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#sepal_lengthで5.1のデータかつspeciesがversicolorのデータを抽出
print(iris.query('sepal_length == 5.1 & species == "versicolor"'))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
98 5.1 2.5 3.0 1.1 versicolor
ランダム指定
元のデータからランダムでデータを抽出する場合には、sample()を使用します
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#データを全体の50%の割合でランダム抽出する
print(iris.sample(frac=0.5,random_state=0))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
114 5.8 2.8 5.1 2.4 virginica
62 6.0 2.2 4.0 1.0 versicolor
33 5.5 4.2 1.4 0.2 setosa
107 7.3 2.9 6.3 1.8 virginica
7 5.0 3.4 1.5 0.2 setosa
.. ... ... ... ... ...
111 6.4 2.7 5.3 1.9 virginica
95 5.7 3.0 4.2 1.2 versicolor
20 5.4 3.4 1.7 0.2 setosa
15 5.7 4.4 1.5 0.4 setosa
52 6.9 3.1 4.9 1.5 versicolor
[75 rows x 5 columns]
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
#データを100個ランダム抽出する
print(iris.sample(n=100,random_state=0))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
114 5.8 2.8 5.1 2.4 virginica
62 6.0 2.2 4.0 1.0 versicolor
33 5.5 4.2 1.4 0.2 setosa
107 7.3 2.9 6.3 1.8 virginica
7 5.0 3.4 1.5 0.2 setosa
.. ... ... ... ... ...
139 6.9 3.1 5.4 2.1 virginica
42 4.4 3.2 1.3 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
129 7.2 3.0 5.8 1.6 virginica
17 5.1 3.5 1.4 0.3 setosa
[100 rows x 5 columns]
データの整形
代表値の算出
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
# 有効データのカウント数
print(iris['sepal_length'].count())
>>>出力結果
150
# 合計値
print(iris['sepal_length'].sum())
>>>出力結果
876.5
# 最小値
print(iris['sepal_length'].min())
>>>出力結果
4.3
# 最大値
print(iris['sepal_length'].max())
>>>出力結果
7.9
# 平均値
print(iris['sepal_length'].mean())
>>>出力結果
5.843333333333335
# 中央値
print(iris['sepal_length'].median())
>>>出力結果
5.8
# 最頻値
print(iris['sepal_length'].mode())
>>>出力結果
0 5.0
# 標本分散
print(iris['sepal_length'].var())
>>>出力結果
0.6856935123042505
# 標本標準偏差
print(iris['sepal_length'].std())
>>>出力結果
0.8280661279778629
置換
replaceを使って要素を置換する場合には、第一引数に元の要素の値、第二引数に置換後の値を指定します
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
print(iris)
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
#speciesの列でvirginicaというデータをsetosaに置換する
print(iris.replace('virginica','setosa'))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 setosa
146 6.3 2.5 5.0 1.9 setosa
147 6.5 3.0 5.2 2.0 setosa
148 6.2 3.4 5.4 2.3 setosa
149 5.9 3.0 5.1 1.8 setosa
異なる複数の要素を一括で置換
異なる複数の要素を一括で置換したい場合には、辞書もしくはリストを使って行います
辞書で指定する場合には、第一引数に{元の値:置換後の値}の辞書を指定します
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
print(iris)
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 setosa
146 6.3 2.5 5.0 1.9 setosa
147 6.5 3.0 5.2 2.0 setosa
148 6.2 3.4 5.4 2.3 setosa
149 5.9 3.0 5.1 1.8 setosa
#virginicaをsetosaに、3.5の値を0.0に置換
print(iris.replace({'virginica':'setosa',3.5:0.0}))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 0.0 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 setosa
146 6.3 2.5 5.0 1.9 setosa
147 6.5 3.0 5.2 2.0 setosa
148 6.2 3.4 5.4 2.3 setosa
149 5.9 3.0 5.1 1.8 setosa
リストで置換する場合には、第一引数に元の値のリスト、第二引数に置換後の値のリストを指定します
リストのサイズが一致していないとエラーになります
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
print(iris)
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 setosa
146 6.3 2.5 5.0 1.9 setosa
147 6.5 3.0 5.2 2.0 setosa
148 6.2 3.4 5.4 2.3 setosa
149 5.9 3.0 5.1 1.8 setosa
#virginicaをsetosaに、0.2の値を0.0に置換
print(iris.replace(['virginica',0.2],['setosa',0.0]))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.0 setosa
1 4.9 3.0 1.4 0.0 setosa
2 4.7 3.2 1.3 0.0 setosa
3 4.6 3.1 1.5 0.0 setosa
4 5.0 3.6 1.4 0.0 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 setosa
146 6.3 2.5 5.0 1.9 setosa
147 6.5 3.0 5.2 2.0 setosa
148 6.2 3.4 5.4 2.3 setosa
149 5.9 3.0 5.1 1.8 setosa
削除
データを削除するには「drop」を使用します
import pandas as pd
import seaborn as sns
sns.set()
iris=sns.load_dataset("iris")
# 行の削除「行番号もしくは行名で指定」
# [inplace=True]:元のDataFrameを更新する。デフォルトはFalse
print(iris.drop(0))
>>>出力結果
sepal_length sepal_width petal_length petal_width species
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
5 5.4 3.9 1.7 0.4 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
# 列の削除「列名で指定」
print(iris.drop('sepal_length', axis=1))
>>>出力結果
sepal_width petal_length petal_width species
0 3.5 1.4 0.2 setosa
1 3.0 1.4 0.2 setosa
2 3.2 1.3 0.2 setosa
3 3.1 1.5 0.2 setosa
4 3.6 1.4 0.2 setosa
.. ... ... ... ...
145 3.0 5.2 2.3 virginica
146 2.5 5.0 1.9 virginica
147 3.0 5.2 2.0 virginica
148 3.4 5.4 2.3 virginica
149 3.0 5.1 1.8 virginica
pandasについて理解ができたら、実際にデータ分析・機械学習を実装していきましょう
Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップ
Pythonで機械学習に学んで実装してみよう【サンプルコードあり】