LEVEL 7 ・ Excel / Lesson 16
部署別に集計して、Excelに書き出す
groupby で部署別・担当別に集計し、結果を新しいExcelファイルに保存します。
このレッスンが終わったら
「groupby で、グループに分けて集計できる。結果は to_excel で保存できる」と言える。
できることを見る
Excelで「部署別の合計」を出すには、ピボットテーブルや SUMIF を使いますね。Pythonでは、groupby(グループに分ける)という道具を使います。
import pandas as pd
df = pd.read_excel("sales.xlsx")
print(df.groupby("部署")["金額"].sum())動かしてみる
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
部署ごとの合計が、表示されました。営業が478000、企画が251000、総務が83000です。
1行ずつ読む
df.groupby("部署")表を、「部署」ごとのグループに分ける["金額"]その中の、「金額」の列に注目する.sum()グループごとに、合計を出す日本語にすると
「.sum()」を、「.mean()(平均)」や「.count()(件数)」に変えれば、別の集計になります。Excelのピボットテーブルで、「合計」を「平均」に変えるのと同じです。
1か所だけ変える
① 担当者別にする。 "部署" を "担当" に変えるだけです。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
② 合計と件数を、同時に出す。 agg に、集計の種類をリストで渡します。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
③ 結果をExcelに書き出す。 集計の結果を、新しいExcelファイルとして保存します。reset_index() は、「部署」を普通の列に戻す、おまじないです。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
to_excel("ファイル名", index=False) で、表をExcelファイルに書き出せます。index=False は、行番号(0, 1, 2…)を書かない、という指定です。最後の1行で、書き出したファイルを読み戻して、確かめています。
④ クロス集計(ピボットテーブル)。 「部署」と「商品」の、組み合わせごとの合計を出します。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
Excelのピボットテーブルと、同じ結果です。index が行、columns が列、values が集計する値、aggfunc が集計の種類、fill_value=0 が、データがない所を0にする指定です。
自分で書く
お題① 部署別の合計を求めて、「営業」部の合計だけを表示してください。(478000)
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
total は、部署名で取り出せます。print(total["営業"]) と書きます。
答えの例を見る
import pandas as pd
df = pd.read_excel("sales.xlsx")
total = df.groupby("部署")["金額"].sum()
print(total["営業"])お題② 商品別の合計を、product.xlsx というファイルに書き出し、読み戻したときの「行数と列数」を表示してください。(3種類の商品なので、(3, 2) になります)
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
df.groupby("商品")["金額"].sum().reset_index() の結果を、to_excel("product.xlsx", index=False) で保存します。最後に pd.read_excel("product.xlsx").shape を表示します。
答えの例を見る
import pandas as pd
df = pd.read_excel("sales.xlsx")
result = df.groupby("商品")["金額"].sum().reset_index()
result.to_excel("product.xlsx", index=False)
print(pd.read_excel("product.xlsx").shape)