Python Pandasを使ってExcel読み込みと書き込み

Pythonのデータ解析のライブラリであるpandasを利用してExcelの読み込み方法を確認していきます。ExcelはCSVファイルとは異なり複数のシートを含めることが可能です。複数のシートがあるExcelファイルからのデータの取得方法についても説明しています。Excelからデータ取得後の処理については各自のアプリケーションに依存するのでデータ取得後のデータの処理方法については本文書では解説を行っていません。
目次
Pandasのインストール
使用しているPythonの環境にPandasがインストールされているか確認を行い、インストールされていない場合にインストールを行います。
インストールされているパッケージの一覧表示にはpip list、個別のパッケージを確認する場合はpip showコマンドを利用します。
pip listを実行してpandasのパッケージが表示されなければ、pip install pandasコマンドでインストールを行います。
$ pip install pandas
pandasをインストールすると一緒にpytz, six, python-dateutil, numpyもインストールされます。
また、Excelファイルを読み込むためには、xlrdパッケージもインストールする必要があります。
$ pip install xlrd

Excelファイルの読み込み
Excelファイルを読み込むために read_excelを使用します。ここではsales.xlsxというファイルの読み込みを行います。
import pandas as pd
df = pd.read_excel('sales.xls')
print(df)

実行するとEXCELファイルから読み込まれたデータを表示することができます。
$ python test.py
日付 販売数
0 2019-09-01 100
1 2019-09-02 40
2 2019-09-03 32
3 2019-09-04 487
4 2019-09-05 2
5 2019-09-06 38
Excelファイルを開いたままpythonプログラムを実行するとPermission Errorが出て読み込みができないのでpythonでExcelを読み込む時はファイルを閉じて実行してください。
Excelファイルのシート読み込み
Excelファイルの中に複数シートがある場合は、すべてを読み込むことも指定したシートのみ読み込むことも可能です。
複数のシートがあってもシート読み込みオプションsheet_nameを指定しなければ最初のシートしか読み込まれません。
シートの読み込み設定には、sheet_nameオプションを使います。
すべてのシートを読み込む
sheet_nameをNoneに設定するとすべてのシートを読み込むことができます。
df = pd.read_excel('sales.xlsx',sheet_name =None)
今回使用したEXCELファイルには3つのシートがあるためEXCELファイルを読み込むと下記のように表示されます。
$ python test.py
OrderedDict([('Sheet1', 日付 販売数
0 2019-09-01 100
1 2019-09-02 40
2 2019-09-03 32
3 2019-09-04 487
4 2019-09-05 2
5 2019-09-06 38), ('Sheet2', 日付 販売数
0 2018-09-01 50
1 2018-09-02 58
2 2018-09-03 380
3 2018-09-04 30
4 2018-09-05 5
5 2018-09-06 12), ('Sheet3', 日付 販売数
0 2017-09-01 5
1 2017-09-02 100
2 2017-09-03 49
3 2017-09-04 39
4 2017-09-05 62
5 2017-09-06 92)])
シート名を指定して読み込む
sheet_nameオプションにシート名を指定することで指定したシートのみ読み込むことができます。今回はsheet1とsheet3を読み込みます。
df = pd.read_excel('sales.xlsx',sheet_name =['Sheet1','Sheet3'])
実行するとSheet1, Sheet3のシートを読み込むことができます。
$ python test.py
OrderedDict([('Sheet1', 日付 販売数
0 2019-09-01 100
1 2019-09-02 40
2 2019-09-03 32
3 2019-09-04 487
4 2019-09-05 2
5 2019-09-06 38), ('Sheet3', 日付 販売数
0 2017-09-01 5
1 2017-09-02 100
2 2017-09-03 49
3 2017-09-04 39
4 2017-09-05 62
5 2017-09-06 92)])
シート番号を指定して読み込む
sheet_nameオプションにシート番号を指定する場合は最初のシートが0になるので注意が必要です。今回は2番目のシートのみ取得します。
複数の場合は配列で指定していましたが、1つの場合はシートの番号だけ指定するだけで大丈夫です。
df = pd.read_excel('sales.xlsx',sheet_name =1)
実行するとSheet2を読み込むことができます。
$ python test.py
日付 販売数
0 2018-09-01 50
1 2018-09-02 58
2 2018-09-03 380
3 2018-09-04 30
4 2018-09-05 5
5 2018-09-06 12
シート名とシート番号を別々に説明していましたが、これらが混在していても問題はありません。
また、読み込む順番を変えることもできます。
df = pd.read_excel('sales.xlsx',sheet_name =[1,'Sheet1'])
下記のように読み込んだシートは表示されます。
$ python test.py
OrderedDict([(1, 日付 販売数
0 2018-09-01 50
1 2018-09-02 58
2 2018-09-03 380
3 2018-09-04 30
4 2018-09-05 5
5 2018-09-06 12), ('Sheet1', 日付 販売数
0 2019-09-01 100
1 2019-09-02 40
2 2019-09-03 32
3 2019-09-04 487
4 2019-09-05 2
5 2019-09-06 38)])
OrderedDictから個別に取り出す
複数のシートを取り出した時、それぞれのシートのデータはOrderedDictの中に入っています。シート別にOrderedDictから取り出した場合はforを使って下記のように行います。
import pandas as pd
df = pd.read_excel('sales.xlsx',sheet_name =[1,'Sheet1'])
for key in df:
print(df[key])
$ python test.py
日付 販売数
0 2018-09-01 50
1 2018-09-02 58
2 2018-09-03 380
3 2018-09-04 30
4 2018-09-05 5
5 2018-09-06 12
日付 販売数
0 2019-09-01 100
1 2019-09-02 40
2 2019-09-03 32
3 2019-09-04 487
4 2019-09-05 2
5 2019-09-06 38
読み込んだシートの情報を1行毎取り出す
読み込んだデータを1行ずつ取得したい場合はdf.valuesを使って取り出すことができます。df.valuesにfor文でloopすることで1行ごとにデータを取り出すことができます。
import pandas as pd
df = pd.read_excel('sales.xlsx')
for row in df.values:
print(f'{row[0]}と{row[1]}')
実行すると下記のように表示されます。
$ python test.py
2019-09-01 00:00:00と100
2019-09-02 00:00:00と40
2019-09-03 00:00:00と32
2019-09-04 00:00:00と487
2019-09-05 00:00:00と2
2019-09-06 00:00:00と38
EXCELのファイルからシート毎の行データを1つ1つ取得することができたので取得したデータを加工してさまざまな用途に利用することも可能です。ここからの作業はそれぞれの目的に合わせてプログラムを作成していく必要があります。