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 というディレクトリを作り,これから使うデータはそこに格納していくとしましょう。試しに下記 コード2foo.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 をアップロードしておいてから実行してください。読み込みたいファイルのパスをコピーするには,下の画像のようにファイルを右クリックして,「パスをコピー」でコピーします。

alternative

コード 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 では,データフレーム df1df2 を,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 では,df1df2paymentkingaku という 別々のシート とした新しい 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