LEVEL 8 ・ 自動化 / Lesson 20

部署別のレポートを、自動で作る

部署ごとに、その部署の分だけのExcelを自動で保存します。ファイル名も自動で付けます。

目安 20分 ・ インストール不要

このレッスンが終わったら

「グループごとに取り出して、ファイル名を変えながら保存できる。f文字列で値を文字に埋め込める」と言える。

STEP 1

できることを見る

部署ごとに、その部署の分だけのレポートを、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_")))
STEP 2

動かしてみる

部署ごとのExcelを作るpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

「企画」「営業」「総務」の3つのExcelファイルが、自動で作られました。部署が100個に増えても、同じコードで作れます。

STEP 3

1行ずつ読む

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_」で始まるものを並べて表示する

日本語にすると

部署ごとにグループ分けして、それぞれの部署の行だけを、「report_部署名.xlsx」というExcelに保存してください。

f"report_{dept}.xlsx" のように、文字列の前に f を付けて、{ } の中に変数名を書くと、その値を文字列に埋め込めます。dept が「営業」なら、report_営業.xlsx になります。

STEP 4

1か所だけ変える

① 月の名前を付ける。 ファイル名に、月を付けるとき、{ } を2つ使います。

ファイル名に月を付けるpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

② 金額の大きい順に並べて保存する。 保存する前に、並べ替えを加えます。

並べ替えてから保存pandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

③ f文字列で、文章を作る。 部署ごとの合計を、文章にして表示します。

部署ごとの合計を、文章にするpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

④ CSVで保存するとき(Excelで開いても文字化けしない方法)。 CSVをExcelで開くと、日本語が文字化けすることがあります。保存のときに、encoding="utf-8-sig" を付けると、防げます。

Excelで開いても文字化けしないCSVpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

b'\xef\xbb\xbf' は、「このファイルは UTF-8 です」と、Excelに教えるための、見えない目印です。

STEP 5

自分で書く

お題① 部署ごとのExcelを作ったあとで、「営業」のレポートを読み戻して、行数を表示してください。(6)

お題①:営業のレポートの行数pandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

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行ずつ表示してください。

お題②:f文字列で文章にするpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

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}円")
STEP 6

仕事ならどう使う?