あるデータの集合から、何らかのデータ変形を行って配列から一つの値を生成することをデータの集約という。

分かりやすい例でいうと、あるデータの合計値のようなものも、データの集約の一つだ。

pandasのgroupby関数で生成したGroupByオブジェクトに対して、様々な集約メソッドを実行することができるが、今回は基礎的なメソッドの紹介に加えて、自分で定義した集約関数を実行したりといった応用的な使い方を紹介する。

サンプルデータフレームの用意

まずは今回使用するサンプルのデータフレームを用意しよう。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 2),
                 columns=['data1', 'data2'])
df['key1'] = ['a', 'a', 'b', 'b', 'a']
df['key2'] = ['one', 'two', 'one', 'two', 'one']

#       data1     data2 key1 key2
# 0  0.255836 -1.054339    a  one
# 1 -0.517051 -0.624876    a  two
# 2  0.784411  0.604397    b  one
# 3 -2.090489  1.272901    b  two
# 4 -1.629585  1.858916    a  one

グループ化したオブジェクトの集約メソッド

用意したデータフレームに基本的な集約メソッドを実行してみる。

countメソッド

countメソッドは欠損値以外の値の数をカウントする。

grouped = df.groupby('key1')
grouped.count()
#       data1  data2  key2
# key1                    
# a         3      3     3
# b         2      2     2

sumメソッド

sumメソッドは欠損値以外の合計を返す。

grouped = df.groupby('key1')
grouped.sum()
#          data1     data2
# key1                    
# a    -1.890800  0.179701
# b    -1.306078  1.877298

meanメソッド

meanメソッドは欠損値以外の平均値を返す。

grouped = df.groupby('key1')
grouped.mean()
#          data1     data2
# key1                    
# a    -1.890800  0.179701
# b    -1.306078  1.877298

medianメソッド

medianメソッドは欠損値以外の算術中央値を返す。

grouped = df.groupby('key1')
grouped.median()
#          data1     data2
# key1                    
# a    -0.517051 -0.624876
# b    -0.653039  0.938649

max / minメソッド

maxメソッドは欠損値以外の最大値を、minメソッドは欠損値以外の最小値を返す。

grouped = df.groupby('key1')
grouped.max()
#          data1     data2 key2
# key1                         
# a     0.255836  1.858916  two
# b     0.784411  1.272901  two

grouped.min()
# key1                         
# a    -1.629585 -1.054339  one
# b    -2.090489  0.604397  one

このほか、標準偏差を返すstdメソッドや、分散を返すvarメソッドなども用意されているが、ここでは割愛する。

自分で定義した集約関数を実行する

次は自分自身で定義した集約関数を、GroupByオブジェクトに対し実行する例を紹介する。

まずは下記の簡単な関数を定義する。

def sample_method(arr):
    return arr.max() - arr.min()

自分で定義した集約関数を使う場合は、GroupByオブジェクトのaggメソッドの引数に関数を渡す。

grouped = df.groupby('key1')
grouped.agg(sample_method)

#          data1     data2
# key1                    
# a     1.885421  2.913255
# b     2.874900  0.668504