Pandas
Pandas は、データの読込、集計、並べ替え、欠損値の補完などを行うことができるライブラリで、データ分析の前処理段階で多く利用されます。.csv、.xlsx 他、多様な形式のデータを読み込みに対応しています。
PCのメモリ容量が許す限り、大量のデータを DataFrame に読み込んむことができ、表計算ソフトよりも高速で処理を行うことができます。
一般にこれを使う際は、まず Pandasでデータを整形した後、NumPyで数値計算を行う・・といった流れになります。
Pandas の特徴は DataFrame にあります。DataFrame にはデータの平均値や行数などの情報把握、並替え、列名変更といったデータ整形機能があります。
準備
インストール
Python 言語のライブラリとしてのインストールになるので、一般の Python3 の環境であれば、Terminalから以下のコマンドでインストールできます。
$ pip3 install pandas $ pip3 list ← 念のため一覧表示
pandasを使った処理の冒頭部分の事例
# 必要なライブラリのインポート import numpy as np import pandas as pd from pandas import DataFrame import matplotlib.pyplot as plt
pandas による DataFrame の定義(構造の理解)
DataFrame は value、index、column の3つの要素から構成されます。
- value:個々のデータ値(行列データ)
- index:行を特定するための「行ラベル」
- column:列を特定するための「列ラベル」
以下、0から11までの数値を 3行・4列にあてはめて定義する事例
df = pd.DataFrame( np.arange(12).reshape(3, 4), columns=['col_0', 'col_1', 'col_2', 'col_3'], index=['row_0', 'row_1', 'row_2'] ) print(df) # col_0 col_1 col_2 col_3 # row_0 0 1 2 3 # row_1 4 5 6 7 # row_2 8 9 10 11
df は DataFrame の略として一般によく用いられる名称です。
メソッド一覧
データの読込
- CSV形式のデータの読込:read_csv()
# iris.csv の読み込み df = pd.read_csv("/path/to/iris.csv")
- Excelファイルの読込:read_excel()
- JSON文字列の読込:read_json()
データの情報把握
- データの特徴を表示:DataFrame.info()
- 要約統計量を表示:DataFrame.describe()
以下のような統計量が一括表示されます。- count:データ件数
- mean:平均
- std:標準偏差
- min:最小値
- max:最大値
- データの一部を表示:DataFrame.head()、DataFrame.tail()
- データの形状を表示:DataFrame.shape
- 行数を取得:DataFrame.index.values
- 列名を取得:DataFrame.columns.values
- それぞれの列の型を取得:DataFrame.dtypes
printメソッドによる統計量の表示
print("平均値:", df.mean() ) print("中央値:", df.median() ) print("分散:", df.var() )
データのスライス・フィルタリング
DataFrame.iloc[ ]、DataFrame.loc[ ]、DataFrame[ ]、DataFrame.query()
- iloc属性によるスライス(行列の番号から)
- 1行目・1列目のデータを抽出
df.iloc[ 1 , 1 ]
- すべての行の 5列目 を抽出(「 : 」 は「すべて取り出す」の意味)
df.iloc[ : , 5 ]
- 1行目・1列目のデータを抽出
- loc属性によるスライス(index, column 名から)
- 特定の index, column から抽出
df.loc[ 1 , 'sepal_width' ]
- すべての行の sepal_width を抽出(「 : 」 は「すべて取り出す」の意味)
df.loc[ : , 'sepal_width' ]
- 特定の index, column から抽出
- データフレームから特定カラムを抽出
- species カラムのみを抽出
df['species']
- 複数のカラムを抽出
df[ ['sepal_length' , 'sepal_width' , 'petal_length' , 'petal_width' ] ]
- species カラムのみを抽出
- queryによるフィルタリング
- species カラムの値が setosa のデータのみを取得
df.query( "species == 'setosa' " )
- species カラムの値が setosa のデータのみを取得
欠損値に関する処理
- 欠損値の確認:DataFrame.isnull().sum()
df.isnull().sum()
- 欠損値のある行を削除:DataFrame.dropna()
df = df.dropna( how='any' )
※ how ='any' は欠損がひとつでもあれば、その行を削除
- 欠損値に値を埋める:DataFrame.fillna()
データの並べ替え
- 値による並べ替え:DataFrame.sort_values()
# sepal_length の降順に並べ替え df.sort_values('sepal_length', ascending=False )
- インデックスによる並べ替え:DataFrame.sort_index()
集計その他
- 列の集計:DataFrame.value_counts()
- 表の集計:DataFrame.groupby()
- groupby().sum():合計
- groupby().mean():平均
- クロス集計
- 単純クロス集計
pd.crosstab( df['カラム名1'] , df['カラム名2'] )
- 正規化
pd.crosstab( df['カラム名1'] , df['カラム名2'] , normalize='index' )
- 単純クロス集計
- 列同士の相関を確認:DataFrame.corr()
df.corr() ← カラム数 x カラム数 のマトリックスとして得られます。
- 列名の変更:DataFrame.rename()
- カテゴリー変数の展開:get_dummies()
可視化
以下、Matplotlib の import が必要です。
import matplotlib.pyplot as plt
- ヒストグラム:DataFrame.hist()
- すべての数値項目について一括表示
df.hist( )
- 生成される画像のサイズを 9インチ x 6インチに指定する場合
df.hist( figsize=(9, 6) )
- 50件分表示の場合
df[:50].hist( figsize=(9, 6) )
- すべての数値項目について一括表示
- グラフ:DataFrame.plot() 引数kindでグラフの種類を指定できます。
df.plot( kind='line' )
- line : 折れ線グラフ(line plot)
- bar : 垂直棒グラフ(vertical bar plot)
- barh : 水平棒グラフ(horizontal bar plot)
- box : 箱ひげ図(boxplot)
- hist : ヒストグラム(histogram)
- kde, density : カーネル密度推定(Kernel Density Estimation plot)
- area : 面グラフ(area plot)
- scatter : 散布図(scatter plot)
- hexbin : hexbin plot
- pie : 円グラフ(pie plot)
- 棒グラフ:DataFrame.bar()
- 箱ひげ図:DataFrame.boxplot()
活用サンプル
以下に、Pandas によるデータ読み込みのサンプルを掲載しています。
ipynb(JupyterNotebook)形式で、GitHubに置いていますが、レンダリングがタイムアウトする場合は、下の nbviewer 経由でご覧下さい。
- GitHub:ReadDataSample.ipynb
- nbviewer:ReadDataSample.ipynb
参考:ライブラリのサンプルデータを読む事例
# サンプルデータセットを取得 from sklearn import datasets boston = datasets.load_boston()
# 読み込んだデータを Pandas の DataFrame型に変換 df = DataFrame(boston.data, columns = boston.feature_names) # 目的変数をDataFrameへ追加 df['MEDV'] = np.array(boston.target)