[解決済み] 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
関連
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み] Pandasのデータフレームで複数の列を選択する
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] 空のPandas DataFrameを作成し、それを埋める?
-
[解決済み] pandas GroupByを使ってグループごとの統計情報(カウント、平均値など)を取得する?
-
[解決済み] 複数のcsvファイルをpandasにインポートし、1つのDataFrameに連結する。
-
[解決済み] PandasのGroupByの出力をSeriesからDataFrameに変換する
-
[解決済み】Pandas DataFrameのより多くの列を見るために出力表示を拡大する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
pythonを使ったオフィス自動化コード例
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
Python LeNetネットワークの説明とpytorchでの実装
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。