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
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というファイルの読み込みを行います。

準備したEXCELファイル
準備したEXCELファイル

拡張子がxlsの場合にはエラーが発生します。


import pandas as pd

df = pd.read_excel('sales.xlsx')

print(df)
ExcelファイルだけではなくpandasではCSVファイルを読み込むことができます。その場合はpd.read_csv(ファイル名)を利用します。文字コードでエラーがでた場合はencodeingで文字コードを指定してください。pd.read_csv(ファイル名),encodeing=”cp932″)でSJISファイルに対応できます。

実行するとEXCELファイルから読み込まれたデータを表示することができます。


$ python test.py
      日付  販売数
0 2022-09-01  100
1 2022-09-02   40
2 2022-09-03   32
3 2022-09-04  487
4 2022-09-05    2
5 2022-09-06   38

実行して下記のエラーメッセージが出た場合はopenpyxlのインストールが必要です。


ImportError: Missing optional dependency 'openpyxl'.  Use pip or conda to install openpyxl.

pip install openpyxlを実行してください。


 $ pip install openpyxl

Excelファイルを開いたままpythonプログラムを実行してPermission Errorが出て読み込みができない場合はファイルを閉じて実行してください。

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行ごとにデータを取り出すことができます。print関数にf”で”の中に{}で変数を指定することで文字列として展開することができます。


import pandas as pd

df = pd.read_excel('sales.xlsx')

for row in df.values:
    print(f'{row[0]}と{row[1]}')
    print(row[0],"と",row[1]) //こちらで可

利用したEXCELファイルの中身は下記の通りです。

準備したEXCELファイル
準備したEXCELファイル

実行すると下記のように表示されます。


$ python test.py
2022-07-01 00:00:00と100
2022-07-02 00:00:00と40
2022-07-03 00:00:00と32
2022-07-04 00:00:00と487
2022-07-05 00:00:00と2
2022-07-06 00:00:00と38

EXCELファイルに複数のシートが存在し、シート名がsaleからデータを取得したい場合は以下のように1行毎のデータを取得することができます。


import pandas as pd

df = pd.read_excel('sales.xlsx',sheet_name=['sale'])
for row in df['sale'].values:
  print(f'{row[0]}と{row[1]}')

EXCELファイルへの書き込み

EXCELファイルから取り出したデータをそのままファイルに書き出したい場合は下記のように行うことができます。通常は取り出したデータを加工して新たにファイルに保存することになります。

実行するとtest.xlsxファイルが作成されます。


import pandas as pd
from openpyxl import Workbook

wb = Workbook()
ws = wb.active

df = pd.read_excel('sales.xlsx')

for row in df.values:
  ws.append([row[0],row[1]])

wb.save('test.xlsx')
作成されたファイルの中身
作成されたファイルの中身

EXCELのファイルからシート毎の行データを1つ1つ取得することができたので取得したデータを加工してさまざまな用途に利用することも可能です。ここからの作業はそれぞれの目的に合わせてプログラムを作成していく必要があります。