Pythonのデータ解析のライブラリであるpandasを利用して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
xrldをインストールしていない場合は、ImportError: Missing optional dependency ‘xlrd’. Install xlrd >= 1.0.0 for Excel support Use pip or conda to 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ファイルを開いたままでプログラムを実行するとPermission Errorが出て読み込みができないので、pythonでExcelを読み込む時はファイルを閉じて実行してください。

Excelファイルのシート読み込み

Excelファイルの中に複数ファイルがある場合は、すべてを読み込むことも指定したシートのみ読み込むことが可能です。

複数のシートがあってもシートを読み込むためのオプションsheet_nameを指定しなければ最初のシートしか読み込まれません。

シートの読み込み設定には、sheet_nameオプションを使います。

すべてのシートを読み込む

sheet_nameをNoneに設定するとすべてのシートを読み込むことができます。


df = pd.read_excel('sales.xlsx',sheet_name =None)

3つのシートがあるファイルを読み込んでいるため実行すると下記のように読み込まれます。


$ 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)])

OrderdDictから個別に取り出す

複数のシートを取り出した時、それぞれのシートのデータは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