LEVEL 8 ・ 自動化 / Lesson 19
複数のExcelを1つにまとめる
支店ごとのExcelを、フォルダごとまとめて1つの表にします。100個でも、同じコードです。
このレッスンが終わったら
「フォルダのファイルを1つずつ読んでリストにため、最後に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)動かしてみる
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
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つにつなげる(行番号は振り直す)- ファイルを探すglob
- 1つずつ読むread_excel
- 支店の列を足すファイル名
- 縦につなぐconcat
日本語にすると
Path(path).stem は、branches/tokyo.xlsx から、フォルダ名と拡張子を取り除いた tokyo を取り出します。
1か所だけ変える
① 支店別に集計する。 まとめた表に、groupby を使います。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
(8, 3) は、8行・3列の意味です。元の2列に、支店の列が増えました。
③ フォルダの名前を間違えると? branches を branch と打ち間違えます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
[](空のリスト)と表示され、そのあと No objects to concatenate(つなぐものがありません)と、エラーになります。ファイルが 0件 だったからです。フォルダ名や、拡張子(.xlsx と .xls など)の書き間違いが、よくある原因です。
自分で書く
お題① 次のコードの、for の中の2行を書いて、3つのファイルをまとめてください。最後に、まとめた表の行数が表示されます。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
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)
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
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())