巨大なExcelファイルをPythonで処理して生産性を向上させる

>こちらの記事は、[Benedikt Droste](https://towardsdatascience.com/@droste.benedikt) 氏により2019年11月に公開された『 [Boost your efficiency and process Excel-files with Python](https://towardsdatascience.com/boost-your-efficiency-and-process-excel-files-with-python-cae650c85d6c) 』の和訳です。
本記事は原著者から許可を得た上で記事を公開しています。

データを扱っていると、必然とExcelに触れることになります。自分のために使うことはなくても、クライアントや同僚が必要とすることでしょう。Excelは小規模なデータセットを扱う表計算に優れています。

しかし私はいつも何万行、何百列もあるようなエクセルシートを見かけては嘆いていました。こうしたシートは処理が重く、計算中にクラッシュしてしまいがちです。

そこで私は、Pythonを使ってこのような巨大なExcelファイルを処理することにしました。そうすることで再利用可能なコードを作成でき、ドキュメントも提供できるという素晴らしい利点もついてきます。早速始めてみましょう！

#PythonでExcelファイルを読み取る
今回処理したいファイルには、約100万行と16列が含まれています。

![](https://miro.medium.com/max/2053/1*nWiB2oIK5wwxehDXpvlKPw.png)

Pythonには、ExcelファイルをDataFrameオブジェクトとして読み取るための`read_excel()`関数が用意されています。

```python
import pandas as pd
import numpy as np
df = pd.read_excel(...\\Excel-Tutorial.xlsx')
```

**訳注：PandasライブラリはPythonには付属していないためpipなどでインストールする必要があります。**

![](https://miro.medium.com/max/1380/1*Zt3aXbX9NHoUZB7V6U1jUA.png)

ご覧の通り、概ねデータはきれいに見えますが、列のヘッダーが間違っているようです。多くのExcelマップには見出しやその他の情報が含まれています。この部分はスキップしてヘッダーとなる行を定義しましょう。

```python3
df = pd.read_excel('…\\Excel-Tutorial.xlsx', header=[1]).reset_index()
```

![](https://miro.medium.com/max/1379/1*YjyEshsxM92hMBg-cCdF7A.png)

引数header=[1]でExcelシートの2行目をヘッダーとして使用するよう指定します。それよりも前の行はすべて無視されます。

#Pandasを使用して計算を行う
マーケティング部門でよく出てくる質問は、各国での年間売上高です。

![](https://miro.medium.com/max/1381/1*jcgLC4z-zNK4ZTvgbSKa0w.png)

この計算は86msで完了できました。PythonでExcelファイルを処理する大きな利点の1つは、Excel自体よりも、あらゆる種類の計算をはるかに高速に処理できるということです。処理が複雑であるほど、速度の利点は大きくなります。

また、営業部門の要求として年およびカテゴリ別にグループ化された各国のデータを必要とすることもあるかもしれません。国別の市場のデータを出力するために計算結果を別々のワークシートに保存する必要があります。

![](https://miro.medium.com/max/1381/1*tLxtgRIfzMDqB5JEEebZ8Q.png)

#結果をExcelとして保存する
次のステップでは、ファイルを再度Excelファイルとして保存し、営業とマーケティング部門に提供します。pd.ExcelWriterオブジェクトを作成し、それぞれ異なるワークシートを作成します。

![](https://miro.medium.com/max/1383/1*3-HRq9pzTFG6uRu3W3Rquw.png)

簡単ですよね？新たに作成されたワークブックを見てみましょう。

![](https://miro.medium.com/max/2323/1*pzxOWeLwZ2jOR80WFAkA8g.png)

ご覧の通り、DataFrameは指定されたワークシートに正しく保存できています。両方の部署にこの素晴らしい成果を送信すると、翌日にメールが届きました。フォーマットと視覚化を要求されました。このようなデータは毎月変換する必要があるため、Pythonでタスクも実行することにしました。

#フォーマットと視覚化
フォーマットと視覚化を行うには、writerオブジェクトを再度作成する必要があります。

![](https://miro.medium.com/max/1386/1*pOckVYzl49_lrxFpsxnvjA.png)

ご覧の通り、コードの冒頭部分は最初の例と同じで、writerオブジェクトを作成しています。`xlsxwriter`を使えば、グラフやフォーマットなどのExcel機能にアクセスできます。これらの機能にアクセスするには、`workbook = writer.book`でworkbookオブジェクトを取得し、`worksheet = writer.sheet['Sales_Sums']`でworksheetオブジェクトを取得する必要があります。この例では、最初のシートに対して変更を行います。グラフを追加し、データの範囲(`=Sales_Sums!$B$2:$B$7'`)を指定して、ワークシートのセルA9に追加します。

同じ方法で、売り上げデータをフォーマットします。`B2:B7`の範囲に3色スケールを追加して、低い値と高い値を視覚的に強調表示します。1列目と2列目のワークシートの幅も`worksheet.set_column(0,1,30)`で調整します。また、売上データの列ヘッダーをフォーマットし、名前を 「`2019 Sales Data`」 に変更します。そして、最後にファイルを保存します。

![](https://miro.medium.com/max/2318/1*1Fehla5bJfXUu5HcaD4lUA.png)

結果は遥かに良くなり、Excelと比べて大きな利点を備えています。そして来月もこれと全く同じ物をワンクリックで作成することができます。

#まとめ
PythonはExcelファイルの処理にとても優れています。Pythonを使えば、巨大なファイルでも簡単に処理でき、再利用可能なコードを作成できるほか、同僚にドキュメントを提供することもできます。またPythonの高度な機能にも簡単にアクセスできることも確認できました。レポートの作成プロセス自体を完全に自動化することもできるでしょう。

# 翻訳協力
Original Author:  **[Benedikt Droste](https://towardsdatascience.com/@droste.benedikt)** 
Thank you for letting us share your knowledge! 

この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当: yumika tomita
翻訳担当: @siho1
監査担当: @nyorochan
公開担当: @aoharu

# ご意見・ご感想をお待ちしております
今回の記事は、いかがだったでしょうか？
・こうしたら良かった、もっとこうして欲しい、こうした方が良いのではないか
・こういったところが良かった
などなど、率直なご意見を募集しております。
いただいたお声は、今後の記事の質向上に役立たせていただきますので、お気軽にコメント欄にてご投稿ください。
みなさまのメッセージをお待ちしております。