ぺーぱーの日々

上機嫌でいること、夢中でいることを目標に、今日も色んなことに手を出します。

MENU

groupbyはまとめるのが仕事で、まとめた結果をわざわざ表示してくれないから厄介だ

ぼく的、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

grouped_dfの実行結果

あれ?

あ、print()すれば良いのか!

print(grouped_df)の実行結果

え?

dataframeが欲しいのに・・・

さっきみたいにこんな感じのdataframeが出てくると思ったのに・・・

想定した通りに結果が得られない原因

「まずは、落ち着きなさい。落ち着くことが肝心だよ。」(サマーウォーズ・栄おばあちゃん)

 

落ち着いて、grouped_dfのデータ型を確認してみる。

grouped_dfのデータ型を確認

最初に取り込んだdfのデータ型も確認。

dfのデータ型を確認

共通しているのは、pandas.core.DataFrameの3つ。

違いは、groupbyの文言があるかどうか。(そりゃ、そうか。)

 

調べてみると、

groupby()は、「集計結果ではなく、DataFrameGroupByオブジェクトが返す」とのこと。

 

出た!混乱の原因、オブジェクト指向!!

 

オブジェクト指向がどうたらこうたらとか考えたら、深みにはまるので、

もう1つの調査した収穫

集計結果を得るためには、groupby()した後に、集計関数を使う」をやってみる。

groupby()したあとに、集計関数する

グループ化したdataframeに対して、何かしらの処理を加える。

代表的な集計関数
  • count()
  • sum()
  • max()
  • min()
  • var()
  • std()

試しに、sum(合計)から。

grouped_df.count()の実行結果

おお!dataframeがちゃんと表示された!

これこれ!欲しかったの!

 

この調子でsum(),max(),min(),var(),std()を実行

grouped_df.sum()の実行結果

grouped_df.max()の実行結果

宣言通り、6種やろうと思いましたが、めんどくさいので、割愛。。。

グループ化した列(「銘柄名」)をインデックスにしたくない時

グループ化した列(「銘柄名」)をインデックスにしたくない時は、

reset_index()を後ろにつける!

groupbyした後にreset_index()した場合

reset_index()あり
groupbyした後にreset_index()しない場合

reset_index()なし

ちょっと応用

ここまでは、

  1. groupbyして
  2. なにか処理して
  3. 結果を表示させる

をして終わったけど、もう1工夫。

やりたいこと
  1. groupbyして
  2. なにか処理して
  3. 特定の列だけを選んで
  4. 結果を表示させる

ということをやりたい。

具体的には、

  1. 「銘柄名」でgroupbyして
  2. 「平均」処理して
  3. 「売却/決済額[円]」列を選んで
  4. 結果を表示させる(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