pandasのgroupbyメソッドに渡すオブジェクトとして、前回の記事ではディクショナリやシリーズを渡す方法を紹介したが、今回はより汎用的な方法としてPythonの関数を渡す例を紹介しよう。

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

前回の記事で使用したサンプルデータフレームをそのまま使うことにする。

import pandas as pd
import numpy as np

people = pd.DataFrame(np.random.randn(5, 5),
                     columns=['a', 'b', 'c', 'd', 'e'],
                     index=['Taro', 'Jiro', 'Saburo', 'Shiro', 'Goro'])
#                a         b         c         d         e
# Taro    0.204297 -0.164669  1.465342 -1.147090 -0.725486
# Jiro   -0.359143 -0.644257 -0.635074  0.426767  0.433401
# Saburo  0.873373  1.171079 -2.692361 -0.319287  0.205302
# Shiro  -0.907428  0.619099 -0.886700  0.711708 -1.245066
# Goro   -0.632772  1.253550 -0.447713 -2.411533  0.168184

len関数を使って文字数ごとにグループ化する

関数を使ったグルーピングには様々な方法があるが、ここではPythonのlen関数を使って、インデックスの文字数ごとにグループ化する例を紹介する。

group_by = people.groupby(len)
group_by.sum()
#           a         b         c         d         e
# 4 -0.787618  0.444624  0.382556 -3.131856 -0.123902
# 5 -0.907428  0.619099 -0.886700  0.711708 -1.245066
# 6  0.873373  1.171079 -2.692361 -0.319287  0.205302

groupbyメソッドの引数にlen関数を渡す。

すると、len関数は元データのインデックス値ごとに呼び出され、関数の戻り値がグループ名として使われる。

つまりこの場合、例えば「Taro」や「Jiro」に対しlen関数を実行すると文字数の4が得られるので、4のグループとして分けられるということだ。

なお、groupbyメソッドの引数に渡すオブジェクトは、リスト、ディクショナリ、シリーズや関数が混在していても、内部的に全てリストへ変換されるので全く問題ない。

key_list = ['one', 'one', 'one', 'two', 'two']
people.groupby([len, key_list]).min()

              a         b         c         d         e
4 one -0.359143 -0.644257 -0.635074 -1.147090 -0.725486
  two -0.632772  1.253550 -0.447713 -2.411533  0.168184
5 two -0.907428  0.619099 -0.886700  0.711708 -1.245066
6 one  0.873373  1.171079 -2.692361 -0.319287  0.205302