LEVEL 8 ・ 自動化 / Lesson 20
部署別のレポートを、自動で作る
部署ごとに、その部署の分だけのExcelを自動で保存します。ファイル名も自動で付けます。
このレッスンが終わったら
「グループごとに取り出して、ファイル名を変えながら保存できる。f文字列で値を文字に埋め込める」と言える。
できることを見る
部署ごとに、その部署の分だけのレポートを、Excelで配りたい場面を考えてみましょう。手作業だと、部署の数だけ、コピー、貼り付け、保存を繰り返します。
Pythonなら、for で、部署ごとのファイルを自動で作れます。
import os
import pandas as pd
df = pd.read_excel("sales.xlsx")
for dept, rows in df.groupby("部署"):
rows.to_excel(f"report_{dept}.xlsx", index=False)
print(dept, len(rows), "行を保存")
print(sorted(f for f in os.listdir(".") if f.startswith("report_")))動かしてみる
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
「企画」「営業」「総務」の3つのExcelファイルが、自動で作られました。部署が100個に増えても、同じコードで作れます。
1行ずつ読む
df.groupby("部署")表を、部署ごとのグループに分けるfor dept, rows in ...:グループを1つずつ取り出す。部署名を「dept」、その部署の行を「rows」と呼ぶ rows.to_excel(f"report_{dept}.xlsx", index=False)その部署の表を、「report_部署名.xlsx」という名前のExcelに保存する print(dept, len(rows), "行を保存")部署名と行数を表示するsorted(f for f in os.listdir(".") if f.startswith("report_"))今のフォルダのファイルのうち、「report_」で始まるものを並べて表示する日本語にすると
f"report_{dept}.xlsx" のように、文字列の前に f を付けて、{ } の中に変数名を書くと、その値を文字列に埋め込めます。dept が「営業」なら、report_営業.xlsx になります。
1か所だけ変える
① 月の名前を付ける。 ファイル名に、月を付けるとき、{ } を2つ使います。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
② 金額の大きい順に並べて保存する。 保存する前に、並べ替えを加えます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
③ f文字列で、文章を作る。 部署ごとの合計を、文章にして表示します。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
④ CSVで保存するとき(Excelで開いても文字化けしない方法)。 CSVをExcelで開くと、日本語が文字化けすることがあります。保存のときに、encoding="utf-8-sig" を付けると、防げます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
b'\xef\xbb\xbf' は、「このファイルは UTF-8 です」と、Excelに教えるための、見えない目印です。
自分で書く
お題① 部署ごとのExcelを作ったあとで、「営業」のレポートを読み戻して、行数を表示してください。(6)
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
pd.read_excel("report_営業.xlsx") で読み込み、len(...) で行数を数えます。
答えの例を見る
import pandas as pd
df = pd.read_excel("sales.xlsx")
for dept, rows in df.groupby("部署"):
rows.to_excel(f"report_{dept}.xlsx", index=False)
print(len(pd.read_excel("report_営業.xlsx")))お題② 部署ごとの合計を、「企画部は251000円」の形で、1行ずつ表示してください。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
print(f"{dept}部は{total}円") と書きます。pass の行は、消して置き換えます。
答えの例を見る
import pandas as pd
df = pd.read_excel("sales.xlsx")
totals = df.groupby("部署")["金額"].sum()
for dept, total in totals.items():
print(f"{dept}部は{total}円")