ぼく的、pandasの落とし穴groupby()について、まとめてみました。
使用データ
実現損益履歴
やりたいこと
銘柄別の実現損益データを見たい
実装
# ライブラリとファイルの読み込み
import pandas as pd
df = pd.read_csv('realized_pl.csv', encoding='shift-JIS')
# データの確認
df.head()
# 銘柄名でグループ化した新たなdataframeを作る
grouped_df = df.groupby('銘柄名')
grouped_df
あれ?
あ、print()すれば良いのか!
え?
dataframeが欲しいのに・・・
さっきみたいにこんな感じのdataframeが出てくると思ったのに・・・
想定した通りに結果が得られない原因
「まずは、落ち着きなさい。落ち着くことが肝心だよ。」(サマーウォーズ・栄おばあちゃん)
落ち着いて、grouped_dfのデータ型を確認してみる。
最初に取り込んだdfのデータ型も確認。
共通しているのは、pandas.core.DataFrameの3つ。
違いは、groupbyの文言があるかどうか。(そりゃ、そうか。)
調べてみると、
groupby()は、「集計結果ではなく、DataFrameGroupByオブジェクトが返す」とのこと。
出た!混乱の原因、オブジェクト指向!!
オブジェクト指向がどうたらこうたらとか考えたら、深みにはまるので、
もう1つの調査した収穫
「集計結果を得るためには、groupby()した後に、集計関数を使う」をやってみる。
groupby()したあとに、集計関数する
グループ化したdataframeに対して、何かしらの処理を加える。
代表的な集計関数
- count()
- sum()
- max()
- min()
- var()
- std()
試しに、sum(合計)から。
おお!dataframeがちゃんと表示された!
これこれ!欲しかったの!
この調子でsum(),max(),min(),var(),std()を実行
宣言通り、6種やろうと思いましたが、めんどくさいので、割愛。。。
グループ化した列(「銘柄名」)をインデックスにしたくない時
グループ化した列(「銘柄名」)をインデックスにしたくない時は、
reset_index()を後ろにつける!
groupbyした後にreset_index()した場合
groupbyした後にreset_index()しない場合
ちょっと応用
ここまでは、
- groupbyして
- なにか処理して
- 結果を表示させる
をして終わったけど、もう1工夫。
やりたいこと
- groupbyして
- なにか処理して
- 特定の列だけを選んで
- 結果を表示させる
ということをやりたい。
具体的には、
- 「銘柄名」でgroupbyして
- 「平均」処理して
- 「売却/決済額[円]」列を選んで
- 結果を表示させる(groupbyした列はインデックスにしない)
をしたい。
実装コード
grouped_df = df.groupby(['銘柄名'])['売却/決済額[円]'].aggregate('mean').reset_index()
grouped_df
実行結果
まとめ
groupbyについてまとめると、
- groupby()は、「まとめる」までがお仕事
- まとめたけど、何?とならないように、してほしい処理を書いてあげる(sumとかcountとか)
参考サイト
https://engineer-lifestyle-blog.com/code/python/pandas-groupby-usage-with-sample-code/#DataFrame-2