06. PythonによるExcelの自動化
6.1 Colabにおけるデータの読込準備
6.1.1 マウント
いわゆる「PythonによるExcelの自動化」というのは,毎週,毎月,毎年行っている作業でデータだけが違うという作業であれば,プログラムを組んでしまって,更新すべきところだけ更新すればよいという考え方です。プログラムを組む人にならなくても,基礎がわかれば,更新すべきところがどこなのかがわかり,そこだけ入れ替えれば良いわけです。
仕事の引き継ぎも楽になるし,データをExcel自体でいじってしまってメチャクチャになる😢といった悲劇も起こりにくくなります。従ってここでいう「自動化」とは,みなさんの発想次第,応用次第で各種の業務の効率化につながるかもしれないスキルと知識のことです。
それでは 実習用IPython Notebook を開いて,そこにGoogle Drive内のデータを読み取れるように,下記 コード1 で マウント をしましょう。
コード 1
from google.colab import drive
drive.mount("/content/drive")
Colab Notebooks
ディレクトリ内に data
というディレクトリを作り,これから使うデータはそこに格納していくとしましょう。試しに下記 コード2 で foo.txt
というテキストファイルを作って,data
に格納してみましょう。
コード 2
with open("/content/drive/My Drive/Colab Notebooks/data/foo.txt", "w") as f:
f.write("Hello Google Drive!")
!cat /content/drive/My\ Drive/Colab\ Notebooks/data/foo.txt
下記 コード3 でドライブに反映します。
コード 3
drive.flush_and_unmount()
print("Colabに加えたすべての変更が,グーグルドライブに反映されました。")
6.2 Pythonによるファイル操作
6.2.1 csv ファイルの書き出しと読込
コード4 は,データフレームをcsvファイルとして書き出します。ここで pandas
ライブラリーを使います。データラングリング段階でとても良く使われるライブラリーで,データ解析までカバーしています。
コード 4
import pandas as pd
item_list = []
branch = input("支店記号を入力してください 終了は-1:")
while(branch != "-1"):
year = input("支払年を入力してください:")
month = input("支払月を入力してください:")
payment = input("金額を入力してください:")
item_list.append([branch, year, month, payment])
branch = input("支店記号を入力してください 終了は-1:")
df1 = pd.DataFrame(item_list, columns = ["branch", "year", "month", "payment"])
df1.to_csv("/content/drive/My Drive/Colab Notebooks/data/payment.csv")
print("プログラム終了")
コード5 では,csvファイルの読み込みをします。すでに作成しておいた data
ディレクトリに kingaku.csv
をアップロードしておいてから実行してください。読み込みたいファイルのパスをコピーするには,下の画像のようにファイルを右クリックして,「パスをコピー」でコピーします。
コード 5
import pandas as pd
df2 = pd.read_csv("/content/drive/My Drive/Colab Notebooks/data/kingaku.csv")
print(df2)
6.2.2 Excel ファイルの読込・統合・書き出し
コード6 では,データフレーム df1
と df2
を,Excelで書き出します。そのために,openpyxl
ライブラリーを読み込んで,その中の to_excel()
関数を使います。
コード 6
import openpyxl
df1.to_excel("/content/drive/My Drive/Colab Notebooks/data/payment.xlsx")
df2.to_excel("/content/drive/My Drive/Colab Notebooks/data/kingaku.xlsx")
コード7 では,glob
も読み込んで,data ディレクトリに入っている すべてのExcelファイル を glob
で取り出します。それらを data_list
として宣言します。そして data_list
のExcelファイル群を for
文でひとつずつ list
という空のリストに格納していきます。さらに list
のExcelを読んで concat
関数で結合したものを df3
とします。それを to_excel
メソッドで total
というExcelに書き出すときに,引数のオプションで index=False
としておけば,最左列にインデックスを挿入しません。
コード 7
import openpyxl
import glob
import pandas as pd
data_list = glob.glob("/content/drive/MyDrive/Colab Notebooks/data/*.xlsx")
list = [ ]
for data in data_list:
list.append(pd.read_excel(data))
df3 = pd.concat(list)
df3.to_excel("/content/drive/MyDrive/Colab Notebooks/data/total.xlsx", index = "False")
コード8 では,df1
と df2
を payment
と kingaku
という 別々のシート とした新しい sheets.xlsx
というExcelファイルにして書き出します。
コード 8
with pd.ExcelWriter("/content/drive/MyDrive/Colab Notebooks/data/sheets.xlsx") as writer:
df1.to_excel(writer,sheet_name = "payment", index = "False")
df2.to_excel(writer,sheet_name = "kingaku", index = "False")
コード9 では,月別支店別の クロス集計表 を作成してみましょう。
コード 9
import pandas as pd
df4 = pd.read_excel("/content/drive/MyDrive/Colab Notebooks/data/total.xlsx", sheet_name = "Sheet1")
df4 = pd.crosstab(df4["month"], df4["branch"], values = df4["payment"], aggfunc = "sum", margins = True, margins_name = "Total")
with pd.ExcelWriter("/content/drive/MyDrive/Colab Notebooks/data/crosstab.xlsx") as writer:
df4.to_excel(writer,sheet_name="集計表")
少しずつコードが長くなってきました。Python
はスペースを無視するので,見やすくするためにスペースを入れても,入れなくても結果は同じです。Python
コードの書き方にはたとえば演算子(+
など)の両側に半角スペースを入れるなど,ゆるいしきたり pep8
がありますが,結果が出れば基本的に自由です。
以上のスキルを修得すれば,たとえば今年度のデータを入力したものを昨年度のデータに結合し,Excel に書き出したり,クロス集計表 を作成して各支店の月別の動向を比較したりできます。そしてそれを1回作成すれば,次の年もまた次の年もそのプログラムを使えば同じ作業ができるようになりますし,結合したいExcelを同じディレクトリに入れておけば ループ処理 を使ってすべて結合してくれる,つまり 「自動化」 されるわけです。
Colaboratory × 日本語
English subtitles in YouTube: Click on the gear button for "Settings" > Subtitles > Auto-translate > Choose "English" -> Click on CC Button for Subtitles/closed captions
© Chikako Takeishi. Designed by Chikafumi Nakamura. All Rights Reserved.