和風ましらに

機械学習とか勉強したことを書き認めるブログ

Pandas関数について -集計する時によく使うもの

前回のNumpyの使い方に引き続き、

nissyl.hatenablog.com

今回はPandas関数で、集計する際によく使う「groupby関数」「pivot_table関数」について整理。 Irisのデータセットを使って、色々触っていきます。

データ準備

[in]
import sklearn,seaborn as sns
import numpy as np
import pandas as pd

df = sns.load_dataset("iris")
df .head()

[out]
    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

groupby関数

データをある列のカテゴリーなどに従って、集計することができる。 イメージはSQLのgroup by句に似ている。

今回だと、speciesに注目してsepal_lengthの平均を算出。

[in]
df_temp =df.copy()
df_t = pd.DataFrame()

grep = df_temp.groupby('species') #species毎に集計
df_t['avg'] = grep['sepal_length'].mean()
df_t.head()

[out]
species     avg
setosa      5.006
versicolor  5.936
virginica   6.588

pivot_table関数

ピボットテーブルを作ることができる関数です。 使う際に、最低3つの引数を指定してあげる必要があります。

  • data: 元データのpandas.DataFrameオブジェクトを指定。
  • index: 元データの列名を指定。結果の行見出しとなる。
  • columns: 元データの列名を指定。結果の列見出しとなる。

また、これに加えて確認したいカラムの列名指定を"values"という引数に入れてあげると該当のカラムのみを含むピボットテーブルを作成することができる。

[in]

df['test'] = df['petal_length'] > 3.5 # 挙動を確認する目安を設ける
pd.pivot_table(df, index = 'species', columns='test',values='petal_length')

[out]

test       False    True

species     
setosa      1.462   NaN

versicolor  3.320   4.364444

virginica   NaN 5.552000

またvaluesに何も指定しないと、引数index, columnsに指定していない全ての列の平均値が算出される。(データ型が数値でない列は除外されます。)

平均値以外の値を算出する場合は、引数aggfuncにnumpyで集計方法を指定してあげれば算出できる。

[in]
pd.pivot_table(df, index = 'species', columns='test',values='petal_length',aggfunc =np.sum)

[out]
test    False   True
species     
setosa  73.1    NaN
versicolor  16.6    196.4
virginica   NaN 277.6