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