pandasのグループ化の方法として、リスト(配列)を渡す方法を以前の記事で紹介した。
今回は、ディクショナリをgroupbyメソッドに渡す例を紹介する。
サンプルデータフレームの用意
まずはサンプルデータフレームを用意する。
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
グループ化した列ごとの合計を算出する例
今回は、どの列をグループ化するかを管理するディクショナリをマッピング情報として持たせ、グループ化した列ごとの合計を算出する例を見ていこう。
mapping = {'a': 'red', 'b': 'red', 'c': 'blue',
'd': 'blue', 'e': 'red'}
前回の記事のようにリストをgroupbyメソッドに渡す場合は、このディクショナリに変換すれば良いが、ディクショナリを直接渡すことが可能だ。
groupbyメソッドで作成されたGroupByオブジェクトにsumメソッドを実行すると、マッピング情報をもとにグループ化された列ごとの合計値が結果として得られた。
group_by = people.groupby(mapping, axis=1)
group_by.sum()
# blue red
# Taro 0.318252 -0.685858
# Jiro -0.208307 -0.569999
# Saburo -3.011648 2.249754
# Shiro -0.174992 -1.533395
# Goro -2.859246 0.788962
シリーズをマッピングとして使う
シリーズをgroupbyメソッドに渡すことも可能だ。
mapping = {'a': 'red', 'b': 'red', 'c': 'blue',
'd': 'blue', 'e': 'red'}
map_series = pd.Series(mapping)
people.groupby(map_series, axis=1).sum()
# blue red
# Taro 0.318252 -0.685858
# Jiro -0.208307 -0.569999
# Saburo -3.011648 2.249754
# Shiro -0.174992 -1.533395
# Goro -2.859246 0.788962
先ほどと全く同じ結果が得られる。