1. ホーム
  2. python

[解決済み] Python pandas groupby 複数列の集約、そしてピボット

2022-03-01 18:51:31

質問

Pythonで、以下のようなpandasのDataFrameを持っています。

Item | shop1 | shop2 | shop3 | Category
------------------------------------
Shoes| 45    | 50    | 53    | Clothes
TV   | 200   | 300   | 250   | Technology
Book | 20    | 17    | 21    | Books
phone| 300   | 350   | 400   | Technology

ここで、shop1, shop2, shop3 は異なるショップの各アイテムのコストです。 さて、このようにデータをクリーニングして、DataFrameを返す必要があります。

Category (index)| size| sum| mean | std
----------------------------------------

ここで、sizeは各Categoryのアイテム数、sum, mean, stdは3つのショップに適用される同じ関数に関連するものです。これらの操作を分割-適用-結合のパターン(groupby, aggregate, apply,...) で行うにはどうしたらよいでしょうか?

どなたか助けてください。これには気が狂いそうです...ありがとうございます!

どのように解決するのですか?

Pandas 0.22以降では、集約によるグループでの辞書の使用が非推奨であることを考慮して編集されています。

非常によく似た辞書を設定し、辞書のキーで関数を指定し、辞書自体で列の名前を変更するようにしました。

rnm_cols = dict(size='Size', sum='Sum', mean='Mean', std='Std')
df.set_index(['Category', 'Item']).stack().groupby('Category') \
  .agg(rnm_cols.keys()).rename(columns=rnm_cols)

            Size   Sum        Mean        Std
Category                                     
Books          3    58   19.333333   2.081666
Clothes        3   148   49.333333   4.041452
Technology     6  1800  300.000000  70.710678


オプション1
使用 agg ← ドキュメントへのリンク

agg_funcs = dict(Size='size', Sum='sum', Mean='mean', Std='std')
df.set_index(['Category', 'Item']).stack().groupby(level=0).agg(agg_funcs)

                  Std   Sum        Mean  Size
Category                                     
Books        2.081666    58   19.333333     3
Clothes      4.041452   148   49.333333     3
Technology  70.710678  1800  300.000000     6

オプション2
もっと安く
使用 describe ← ドキュメントへのリンク

df.set_index(['Category', 'Item']).stack().groupby(level=0).describe().unstack()

            count        mean        std    min    25%    50%    75%    max
Category                                                                   
Books         3.0   19.333333   2.081666   17.0   18.5   20.0   20.5   21.0
Clothes       3.0   49.333333   4.041452   45.0   47.5   50.0   51.5   53.0
Technology    6.0  300.000000  70.710678  200.0  262.5  300.0  337.5  400.0