概要
pandasのgroupbyで1つのカラムに複数の関数を適用させるためにdict形式でagg()の引数を与えていたが、v1でその機能が削除されてしまっていたため、使用できなくなった。その解決方法。
データはpandasのドキュメントにあったものを利用しています。
データ
animals = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
'height': [9.1, 6.0, 9.5, 34.0],
'weight': [7.9, 7.5, 9.9, 198.0]})
今回やろうとした処理とエラー
# kindごとに、heightの合計値と件数を集計し、それぞれ"sum_all", "count_all"という名前にする
animals.groupby("kind")["height"].agg({"sum_all":"sum", "count_all":"count"})
- 想定していた出力(v1になる前はできてた)
- 実際の出力
SpecificationError: nested renamer is not supported
何が原因だったか
- ドキュメントのwhats newに記載があった
- https://pandas.pydata.org/pandas-docs/stable/whatsnew/v1.0.0.html
- nested renamingというらしいが、これがなくなったらしい
Removed support for nested renaming in DataFrame.aggregate(), Series.aggregate(), core.groupby.DataFrameGroupBy.aggregate(), core.groupby.SeriesGroupBy.aggregate(), core.window.rolling.Rolling.aggregate() (GH18529)
- 以下に記載がありますが、一つのカラムに対してaggregationとrenameを同時に行うことがいけないらしい
解決方法
- 集約とrenameを同時に行っていることが問題なので、それを分ければ良い
animals.groupby("kind")["height"].agg(["sum", "count"])
.rename(columns={"sum": "sum_all",
"count":"count_all"})
- Named Aggrecation(v0.25からの機能)を利用する
animals.groupby("kind")["height"].agg(sum_all="sum",
count_all="count")
- (参考)カラムをしていない状態でのNamed Aggrecationだと以下のような書き方になる
- この書き方だとどの変数に対して集約するか指定できるのでわかりやすい
animals.groupby("kind").agg(sum_all=("height", "sum"),
count_all=("height", "count"))