Pythonの外部ライブラリ pandas で Excelファイル(xlsx, xls)を DataFrame として読み込む方法を解説します。
DataFrame として読み込まれたデータは、様々な加工や集計が可能になります。
pandasの使い方についてはこちらの記事も参考にしてください。
・関連記事:pandasでSeries, DataFrameを作成する
・関連記事:pandas DataFrameからデータを抽出
使用ライブラリ
インストール:必要
インストール:必要(.xlsx用)
インストール:必要(.xls用)
pandas で Excel ファイルを読み込む際には内部で openpyxl, xlrd を利用します。
openpyxlについては以下の記事で紹介しています。
・関連記事:PythonでExcelファイルを操作する(openpyxl)
ライブラリのインストール
.xlsx
を読み込むには openpyxl、.xls
を読み込むには xlrd が必要です。
いずれのライブラリもpipでインストールできます。
・関連記事:Pythonライブラリのインストール(pipの使い方)
Successfully installed ・・・・と表示されればインストールは成功です。
(依存関係のある他のライブラリも同時にインストールされます)
サンプルデータ
Excelファイルは2つのファイルを使用します。ファイルはpython実行ディレクトリに保存されているものとします。
①data.xlsx:ヘッダ(列名)を含むデータが3シート分保存されているファイル
②data_noheader.xlsx:①のヘッダ(列名)を含まないデータ
以降の説明は、xlsx ファイルで進めますが xls の場合でも同様です。
ライブラリのインポート
pandas をインポートします。
1 | import pandas as pd |
openpyxl, xlrd のインポートは不要です。
Excelファイルを読み込む(read_excel)
Excelファイルを読み込むには read_excel()
メソッドを使用します。
例としてpython実行ディレクトリにある data.xlsx を読み込みます。
1 | df = pd.read_excel('data.xlsx') |
pandasのDataFrameとしてシートのデータが読み込まれます。
引数にファイル名以外を指定していない場合は、ファイルの1シート目が読み込まれます。
またインデックスは自動で連番が付与され、1行目がヘッダに設定されます。
XLRDError: Excel xlsx file; not supported
というエラーが発生する場合は、引数にengine="openpyxl"
を追加します。
Excelファイルを読み込む(ExcelFile.parse)
Excel ファイルを読み込む方法として ExcelFile.parse()
を使用する方法もあります。
1 | df = pd.ExcelFile.parse('data.xlsx') |
結果は上述の read_excel()
と同じです。
引数なども全く同じで処理速度も違いがないようなので、基本的には read_excel
を使用すれば良いと思います。
インデックスを指定して読み込む
インデックスを指定して読み込みたい場合は、引数にindex_col
にインデックス番号もしくは列名を指定して読み込みます。
列のインデックス番号は下図のように1列目が0から開始します。今回は1列目をインデックスとして読み込んでみます。
1 | df = pd.read_excel('data.xlsx', index_col=0) |
列名を直接指定しても同じ結果になります。
1 | df = pd.read_excel('data.xlsx', index_col='支店CD') |
下図のように1列目がインデックスに設定されます。
複数のインデックスを指定して読み込む
インデックスを複数指定して読み込むこともできます。
1 | df = pd.read_excel('data.xlsx', index_col=[0,2]) |
列を指定して読み込む
特定の列のみを読み込みたい場合は、usecols
を指定します。
pandasオブジェクト.read_excel(ファイルパス, usecols = A1形式の列見出し範囲)
1 | df = pd.read_excel('data.xlsx', usecols=[0,1,2]) |
または
1 | df = pd.read_excel('data.xlsx', usecols='A:C') |
特定の行を飛ばして読み込む
特定の行だけを飛ばして読み込みたい場合には、引数skiprows
を指定します。飛ばす行番号はリストで指定します。
1シート目の4,5行目を飛ばして読み込んでみます。
1 | df = pd.read_excel('data.xlsx', sheet_name='202004', skiprows=[3,4]) |
支店CDS03, S04の行が飛ばされて読み込まれました。
ヘッダ(列名)を指定しないで読み込む
データにヘッダ(列名)が無い場合、初期設定ではデータ行がヘッダに設定されてしまいます。
その場合は引数に header=None
を指定することで、ヘッダ無しで読み込む事ができます。
(サンプルデータ data_noheader.xlsx を使用します)
1 | df = pd.read_excel('data_noheader.xlsx',sheet_name='202006', header=None) |
ヘッダ(列名)を設定・変更して読み込む
ヘッダ(列名)を設定して読み込みたい場合は、引数names
に列名のリストを指定して読み込みます。
元のデータにヘッダが含まれている場合は、skip_rows=0
で1行目を飛ばして2行目から読み込み、列名を設定することで変更します。
1 2 | df = pd.read_excel('data_noheader.xlsx', names = ['支店番号','支店名称','日付','売上1','売上2','売上3','売上4','売上5']) |
元のデータにヘッダが含まれている場合は、skip_rows=0
で1行目を飛ばして2行目から読み込み、列名を設定することで変更します。(data.xlsx を読み込み)
1 2 3 | df = pd.read_excel('data.xlsx', skiprows=0, names = ['支店番号','支店名称','日付','売上1','売上2','売上3','売上4','売上5']) |
シートを指定して読み込む
読み込むシートを指定する場合は、引数 sheet_name
に読み込みたいシート名を指定します。
(ファイルが1シートのみの場合は不要)
1 | df = pd.read_excel('data.xlsx', sheet_name='202005') |
複数シートの読み込み
sheet_name
にリストでシート名を指定することで、複数のシートを読み込むことができます。
返り値は辞書型になり、シート名がキー、シート内データが値になります。
1 2 3 4 | df = pd.read_excel('data.xlsx', sheet_name=['202004', '202006']) print(df.keys()) #dict_keys(['202004', '202006']) |
全てのシートの読み込み
全てのシートを読み込む場合は sheet_name=None
とします。
この場合も返り値は辞書型で、シート名がキー、シート内データが値になります。
1 2 3 4 | df = pd.read_excel('data.xlsx', sheet_name=None) print(df.keys()) #dict_keys(['202004, '202005', '202006']) |
読み込んだデータの連結
読み込んだ複数シートのデータを縦方向に連結する方法を解説します。
手順は、1.pandasで全シート読み込み → 2.各シートのDataFrameをリストに格納 → 3.pandasで縦連結 の流れになります。
1 2 3 4 5 6 7 8 9 10 | # 1.全シートを読み込み df = pd.read_excel('data.xlsx', sheet_name=None, header=0) # 2.各シートのデータフレームをリストに格納 all_sheet = [] for key in df.keys(): all_sheet.append(df[key]) # 3.リスト内のデータフレームを連結 df_concat = pd.concat(all_sheet, ignore_index=True) |
結果は以下のようになります。
pandas を使用してExcelファイルを読み込む方法を解説しました。
読み込んだデータをExcelファイルに書き込むには以下の記事を参照してください。
・参考記事:pandasでExcelファイルの書き込み(to_excel)
PandasのSeriesやDataFrameについてはこちらの記事を参照してください。
・参考記事:PandasでSeries, DataFrameを作成する
・参考記事:pandas DataFrameからデータを抽出
CSVファイルの読み込み方法はこちらの記事を参照してください。
・参考記事:pandasでCSVファイルを読み込む方法(read_csv)