システム開発が本業でないなら、データ分析の結果を依頼主に提出する際、Excelなどのスプレッドシートにすることが多いと思います。ですから、Pythonでデータ分析するとき、Excelファイルからデータを読み込み、分析結果もExcelファイルに出力できると便利です。
これは、Pandasという拡張パッケージを使う(インポートする)ことで実現できます。
Contents
Pandasのインポート
Pandasをインポートすると、DataFrameという「型」のPythonオブジェクトが使えるようになります。
DataFrameは、Indexというラベルの付いた行と、Columnという変数名を持った列による2次元のデータ配列で、Excelなどのスプレッドシートと似たデータ型です。
連載第1回で紹介したAnacondaというPythonディストリビューションには、既にPandasが含まれているので、新たにインストールをする必要はありません。次のように、(スクリプト[*.py]なりインタプリタなりの)冒頭でimportしておけば、すぐに使い始めることができます。
import pandas as pd
Excelファイルの読み込み
試しに、デスクトップに保存したxlsx形式の実質GDP成長率の時系列データを読み込んでみます。
book ="C:\Users\Desktop\GDP.xlsx" sheet="sheet1" # 読み込むシート名 EXL = pd.ExcelFile(book) # xlsxファイルをPython上で開く Data = EXL.parse(sheet,index_col="TIME")
これで、Dataという名前のDataFrame型のオブジェクトが作られました。インタプリタにDataと入力して呼び出すと、下図のように時系列データが表示されるはずです。
このとき注意が必要なのは、データの入ったxlsxシートをPandasが読み込める形に整えておくこと。1行目をアルファベットの変数名にしておき、空行をつくらずにデータを置いておくのが基本です(下図)。
また、index_colというオプションの値を”TIME”として読み込みましたが、これは、シートの1列目にあるTIMEという日付データを「ラベル列」として使うことを指示したものです。特に指定しなければ、ラベル列は0から始まる自然数の連番になります。
一旦、DataFrame型のオブジェクトを作れば、様々なデータ処理を実に簡単に行うことができます。ここでは、記述統計とチャートの表示だけ紹介しておきます。詳しくは、Pandasの解説サイトや、こちらの解説本が参考になります。
Data.describe() # 記述統計量を出力 Data.plot() # チャートを出力
ちなみに、オブジェクトのあとに”.”を打って、そのあとに操作の名前(たとえば、”plot()”)を綴るというpythonの文法は、「メソッド」と呼ばれるものです。DataというDataFrame型のオブジェクトには、いくつかの統計処理のメソッドが備わっており、それを呼び出しています。この書き方(オブジェクト指向)が軽快なプログラミングを支えています。
Excelファイルに書き込み
1. 新規ファイルに書き込み
続いて、Pythonで何か出力した結果をExcelに書き出す方法ですが、例えば、先ほどの記述統計量の一覧表をExcelファイルに保存してみます。
# 記述統計量一覧のDataFrameオブジェクトを作る desc = Data.describe() # 保存先のファイルパス outpath = r"C:\Users\Desktop\Out.xlsx" # 新規xlsxファイルのsheet1に保存するメソッド desc.to_excel(outpath,"sheet1")
この方法は、新規xlsxファイルを作って保存するものです。そのため、既存のファイル名を指定した場合には、既存ファイルを消して、同じ名前の新ファイルを作ってしまいます。
2. 既存ファイルに新規シートとして書き込み
既存のxlsxファイルに新しいシートを追加する形でDataFrameを保存するには、openpyxlというパッケージのload_workbookという関数を使う必要があります。こちらもAnacondaに含まれていますので、importすることですぐに使えます。
なお、Pythonでの書き込みはUNDO[Ctrl+Z]できませんので、私は既存のxlsxファイルは念のためバックアップを取るようにしています。
import openpyxl as opx outpath= "C:\Users\Desktop\GDP.xlsx" newsheetname="Out" # 新規シート名 # 既存のシートを読み込み、書き込みリストに登録 book = opx.load_workbook(outpath) writer = pd.ExcelWriter(outpath) writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) # 分析結果を新規シートに書き込み登録 desc.to_excel(writer, newsheetname) # 書き込み writer.save()
3. セルを指定して書き込み
最後に、既存のシートの特定のセルに計算した結果を入力する方法を書いておきます。例えば、GDP.xlsx、tableシートにあらかじめ作ってあるテーブルがあり、そのセルB2~B9に記述統計の数値を入力する作業を行ってみます。
editpath= "C:\Users\Desktop\GDP.xlsx"
editsheetname="table" # 既存シート名
# 既存のシートを読み込み、対象セルの値を上書き
book = opx.load_workbook(editpath)
ws = book.worksheets[book.get_sheet_names().index(editsheetname)]
# 2~9の連番で繰り返し。
# DataFrameのから入力したい数値を呼び出し、対応するセルの値を上書き
for i in range(2,10):
ws.cell("B"+str(i)).value = desc.iloc[i-2,0]
# 変更をGDP.xlsxに上書き保存
book.save(editpath)
以上の書き出し方を組み合わせれば、比較的自由にPythonとExcelの連携ができると思います。
例で扱った操作は、わざわざPythonを使う必要のない単純なものでしたが、ある程度大きなデータを繰り返し操作するようなルーティンワークや、本格的なデータ分析の結果をExcelで提出するには役立つと思います。
今後も紹介していきますように、Pythonをベースにして使える機能は、ExcelのVBAを書くよりも圧倒的に豊富ですので、普段Excelを多用している実務家の方にもぜひお勧めしたいと思います。
6 thoughts on “Python for Economist [第2回]: PandasでExcelの読み書き”