LEVEL 8 ・ 自動化 / Lesson 19

複数のExcelを1つにまとめる

支店ごとのExcelを、フォルダごとまとめて1つの表にします。100個でも、同じコードです。

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

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

「フォルダのファイルを1つずつ読んでリストにため、最後に1つにつなぐ。個数が増えても、コードは同じ」と言える。

STEP 1

できることを見る

支店ごとに作られた Excel ファイルを、1つの表にまとめる作業を考えてみましょう。ここには、3支店のファイルがあります。

用意されているフォルダとファイルサンプル
  • branches/
    • tokyo.xlsx
    • osaka.xlsx
    • fukuoka.xlsx

3つなら手作業でもできますが、これが 100個 だったら、どうでしょう。Pythonなら、個数が増えても、書くコードはほとんど同じです。

import glob
from pathlib import Path
import pandas as pd

frames = []
for path in sorted(glob.glob("branches/*.xlsx")):
    df = pd.read_excel(path)
    df["支店"] = Path(path).stem
    frames.append(df)

merged = pd.concat(frames, ignore_index=True)
print(merged)
STEP 2

動かしてみる

3支店のExcelを1つにまとめるpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

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

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

3つのファイルの中身が、縦に並んだ1つの表になりました。しかも、「どの支店のデータか」が分かるように、支店 という列が付きました。

STEP 3

1行ずつ読む

1行ずつ日本語にしてみる
glob.glob("branches/*.xlsx")branches フォルダの中の、「.xlsx で終わるファイル」の一覧を作る(* は「何でもよい」の意味)
sorted(...)名前の順に並べる
for path in ...:ファイルを1つずつ取り出して、「path」と呼ぶ
df = pd.read_excel(path)そのExcelを読み込んで、表(df)にする
df["支店"] = Path(path).stem「支店」という新しい列を作り、ファイル名(拡張子なし)を入れる
frames.append(df)できた表を、frames というリストに追加する
pd.concat(frames, ignore_index=True)リストの中の表を、縦に1つにつなげる(行番号は振り直す)
  1. ファイルを探すglob
  2. 1つずつ読むread_excel
  3. 支店の列を足すファイル名
  4. 縦につなぐconcat
LEVEL 3(繰り返し)・LEVEL 4(リスト)・LEVEL 6(ファイル)・LEVEL 7(pandas)の、総まとめです。

日本語にすると

branches フォルダの Excel を1つずつ読み込み、支店名の列を足して、全部を縦につないで1つの表にしてください。

Path(path).stem は、branches/tokyo.xlsx から、フォルダ名と拡張子を取り除いた tokyo を取り出します。

STEP 4

1か所だけ変える

① 支店別に集計する。 まとめた表に、groupby を使います。

支店別の合計pandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

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

結果
▶ 実行を押すと、ここに結果が出ます
② まとめた結果を、Excelに保存する。
まとめたExcelを保存するpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

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

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

(8, 3) は、8行・3列の意味です。元の2列に、支店の列が増えました。

③ フォルダの名前を間違えると? branches を branch と打ち間違えます。

フォルダ名を間違えてみようpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

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

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

[](空のリスト)と表示され、そのあと No objects to concatenate(つなぐものがありません)と、エラーになります。ファイルが 0件 だったからです。フォルダ名や、拡張子(.xlsx と .xls など)の書き間違いが、よくある原因です。

STEP 5

自分で書く

お題① 次のコードの、for の中の2行を書いて、3つのファイルをまとめてください。最後に、まとめた表の行数が表示されます。

お題①:ループの中を書くpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

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

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

df = pd.read_excel(path) で読み込み、frames.append(df) で追加します。pass の行は、消して置き換えます。

答えの例を見る
import glob
import pandas as pd

frames = []
for path in sorted(glob.glob("branches/*.xlsx")):
  df = pd.read_excel(path)
  frames.append(df)

merged = pd.concat(frames, ignore_index=True)
print(len(merged))

お題② 全支店の、金額の合計を表示してください。(489000)

お題②:全支店の合計pandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

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

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

merged["金額"].sum() を、print で表示します。

答えの例を見る
import glob
import pandas as pd

frames = [pd.read_excel(path) for path in sorted(glob.glob("branches/*.xlsx"))]
merged = pd.concat(frames, ignore_index=True)
print(merged["金額"].sum())
STEP 6

仕事ならどう使う?