Pythonを仕事ではこう使っています(aggメソッド編)
受注先ごとの注文件数と合計金額を日別に集計する必要が出てきたためそのプログラムを書いてみました。
その覚書です。
元のデータはデータベース上にあるので、いつもの如く必要と思われるデータをcsvで出力して、データフレームとして取り込みます。
import pandas as pd
df = pd.read_csv('csvデータのパス', encoding='cp932')
encoding='cp932' は、文字エンコーディング(文字セット)を指定するオプションの一部で、特定の文字セットを使用してテキストデータをエンコードまたはデコードするための指示です。
今取り込みたいcsvファイルの場合はcp932ですが、特に指定しなくても取り込めたり、別の文字エンコーディングを指定しないと取り込めない場合もあるかもしれません。
取り込むデータはざっくりとこんな感じのデータです。
受注日 注文コード 金額
2023-10-23 10:38:01 楽大 35000
2023-10-24 23:40:27 ヤホー 23000
2023-10-25 20:33:41 ママゾン 23000
: : :
次に日別に集計するために日時の加工をします。
データ上では年月日以外にも時分秒まで含まれるので受注日でgroupbyメソッドを使ってグループ分けすると年月日時分秒ごとにグループ分けされてしまいますので、受注日を年月日までにしてしまいます。
df['受注日'] = pd.to_datetime(df['受注日']).dt.strftime("%Y/%m/%d")
pd.to_datetimeで型を一旦datetimeにしてdt.strftimeで年月日の部分を文字列として取り出します。
これでgroupbyメソッドでグループ分けした時に年月日でごとにできます。
今までは前置きで、本日の本題はここから。
受注日、受注先ごとにグループ分けした上で、それぞれのグループの件数、および金額の合計を出力します。
df_gp = df.groupby(['受注日', '注文コード']).agg({'注文コード': 'count', '金額': 'sum'})
df.groupby(['受注日', '注文コード'])でまず、受注日、注文コードごとにグループ分けして、
agg({'注文コード': 'count', '金額': 'sum'})でグループ分けされたそれぞれについて注文コードはカウント、金額は合計を出力します。
(count、sum以外にも'mean'(平均)、'max'(最大値)、'median'(最中央値)なども使えます)
これでdf_gpを表示するとこんな感じになります
注文コード 金額
受注日 注文コード
2023/10/23 楽大 5 134,239
ヤホー 6 245,456
ママゾン 3 209,345
2023/10/24 楽大 2 103,330
ヤホー 4 200,356
ママゾン 7 309,989
: : : :
カラム名を変更してわかりやすくします。
df_gp.columns = ['件数', '合計']
これを表示させるとこうなります。
件数 合計
受注日 注文コード
2023/10/23 楽大 5 134,239
ヤホー 6 245,456
ママゾン 3 209,345
2023/10/24 楽大 2 103,330
ヤホー 4 200,356
ママゾン 7 309,989
: : : :
コードをまとめるとこうです。
import pandas as pd
df = pd.read_csv('csvデータのパス', encoding='cp932')
df['受注日'] = pd.to_datetime(df['受注日']).dt.strftime("%Y/%m/%d")
df_gp = df.groupby(['受注日', '注文コード']).agg({'注文コード': 'count', '金額': 'sum'})
df_gp.columns = ['件数', '合計']
たった5行で簡単に集計ができるのは素晴らしすぎます。
agg()メソッドはかなり使えると思うのでこれかもいろいろ試してみようと思います。
この記事が気に入ったらサポートをしてみませんか?