Python × Excel

Pythonで列のフィールド値ごとにグループ集計する方法(groupby)

2020-10-16

本記事では、Python/Pandasのgroupby関数で列のフィールド値ごとにグループ集計する方法をご紹介します。

Pythonの実行環境

今回は、以下の実行環境でプログラムを実行しています。

・Python 3.7.6
・Jupyterlab 1.2.6
・Pandas:1.1.2

テストデータは、次のような予算管理表を使います。

ファイル名は「テストデータ.xlsx」で、シート名は「予算管理表」です。

■予算管理表

テストデータ

 

本記事で、利用するライブラリはPandasです。
そして、テストデータの予算管理表をdfとして読み込んでおきます。

import pandas as pd
df = pd.read_excel('テストデータ.xlsx', sheet_name = '予算管理表')

 

※本記事では、Pythonのコードの下のコメントアウトは、出力結果を示しています。

 

Pythonで列のフィールド値ごとにグループ集計する方法(groupby)

まず、「列のフィールド値別にグループ集計」とはどういうことでしょうか。

言葉で書くよりもExcelのイメージでみた方が分かりやすいと思います。

Excel_sumif1

 

「件名」列の各フィールド値の単位で、「合計」列〜「2023年度」列の数値を合計したものとなります。

結果が、上の図の赤枠の表の部分となります。

 

これをPythonで行うときは、groupby()を用います。引数に、キーとなる列を指定します。

df.groupby('件名').sum()

結果は次のようになります。

groupby結果
一見、よさそうに見えますが、「件名番号」列という本来不要なものまで合計されてしまっています。

これは、groupby()を使うと、数値型の列が集計されるためです。

これを防ぐには、「件名番号」列のデータ型(形式)を文字列に変更する必要があります。

 

Pythonで列のデータ型(形式)を変更する方法(グループ集計の準備)

テストデータとして読み込んだdfのデータ型を確認します。データ型は、dtypesで確認できます。

df.dtypes
#件名番号               int64
#費目1               object
#費目2               object
#件名                object
#合計                 int64
#2021年度             int64
#2022年度             int64
#2023年度             int64
#担当者コード            object
#実施完了年月    datetime64[ns]

 

確かに、「件名番号」列が数値型になっています。

これを変更するには、astype()を使って、次のように書きます。

df['件名番号'] = df.astype({'件名番号': 'str'})

 

引数には、辞書型で変更する列名と変更後のデータ方を指定します。

 

これで改めて、

df.groupby('件名').sum()

を行うと、結果は次の通りとなり、本来欲しい結果となりました。

groupby結果2

 

最後に、groupbyの留意点として、キーに指定した列のフィールド値の順番が指定できないということです。

上の例では、「メールシステムの利用料」→「メールシステムの改修」→・・・→「販売システムの構築」となっているのを自分の好きな並び順に指定できないということです。

(もし変更できる方法を知っている方はぜひ教えてください。)

 

 

 

以上、Pythonでgroupbyを使って、列のフィールド値別にグループ集計の方法を説明してきました。

最後まで読んでいただき、ありがとうございました。

よく読まれている記事

se-shikaku 1

  社内SEになるには資格って必要?社内SEでキャリアップするときにおすすめの資格は? 回答としては、 社内SEは、対人スキル、実務での対応力や最新情 ...

社内SEの仕事内容 2

  社内SEってどんな仕事なんだろ~ 検索しても転職サイトの記事ばかりでよく分からない・・   確かにそうですね。。実経験を基に、社内SE( ...

side-work-trial 3

  コロナで会社の経営も不安。。個人でお金稼ぎたいな~ 今、こう考えるサラリーマン、OLの方はごまんといると思います。   僕は、本業では社 ...

adsense-pass 4

【3記事で一発合格】Google AdSense申請に合格したブログ情報 こんにちは、いなサラ(@いなサラ|田舎の情シスサラリーマン)です。 2019年10月5 ...

-Python × Excel

© 2020 inasala note