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

先ほどと全く同じ結果が得られる。