pandasでExcelファイル(xlsx, xls)の読み込み(read_excel)
pandasでExcelファイル(拡張子:.xlsx, .xls)をpandas.DataFrameとして読み込むには、pandas.read_excel()関数を使う。
ここでは以下の内容について説明する。
- openpyxl, xlrdのインストール
pandas.read_excel()の基本的な使い方- 読み込むシートを番号・シート名で指定: 引数
sheet_name- 一つのシートを読み込み
- 複数のシートを読み込み
- すべてのシートを読み込み
- ヘッダー、インデックスを指定: 引数
header,index_col - 読み込む列、読み込まない行を指定: 引数
usecols,skiprows,skipfooter
以下のxlsxファイルを例とする。
sheet1とsheet2の二つのシートを持つ。それぞれの中身は以下の通り。
sheet1。
A B C
one 11 12 13
two 21 22 23
three 31 32 33
sheet2。
AA BB CC
ONE 11 12 13
TWO 21 22 23
THREE 31 32 33
Excelファイルの書き込みについては以下の記事を参照
PythonでのExcelファイルの扱いについては以下の記事を参照。
そのほかpandasでのcsvファイル、jsonファイルの読み書き(入出力)については以下の記事を参照。
- 関連記事: pandasでcsv/tsvファイル読み込み(read_csv, read_table)
- 関連記事: pandasでcsvファイルの書き出し・追記(to_csv)
- 関連記事: pandasでJSON文字列・ファイルを読み込み(read_json)
- 関連記事: pandas.DataFrameをJSON文字列・ファイルに変換・保存(to_json)
openpyxl, xlrdのインストール
pandas.read_excel()では内部でopenpyxlとxlrdというライブラリを使っている。
openpyxl, xlrdはPythonでExcelファイル(.xlsx, .xls)の読み込み・書き込みを行うライブラリ。
openpyxlもxlrdもpip(環境によってはpip3)でインストールできる。
$ pip install openpyxl
$ pip install xlrd
デフォルト(引数engine=None)の場合、pandas1.1までは.xlsxも.xlsもxlrdを使用していたが、pandas1.2からは.xlsxはopenpyxl、.xlsはxlrdを使用するようになった。
pandas.read_excel()の基本的な使い方
第一引数ioにExcelファイルのパスまたはURLを指定する。
複数のシートがある場合、最初のシートのみがpandas.DataFrameとして読み込まれる。
import pandas as pd
print(pd.__version__)
# 1.2.2
df = pd.read_excel('data/src/sample.xlsx', index_col=0)
print(df)
# A B C
# one 11 12 13
# two 21 22 23
# three 31 32 33
print(type(df))
# <class 'pandas.core.frame.DataFrame'>
先頭列をindexにするためにindex_col=0としている。詳細は後述。
例は.xlsxファイル(Excel2007以降のExcelファイル)を読み込んでいるが、.xlsファイル(Excel97-2003のExcelファイル)でも同様。
読み込むシートを番号・シート名で指定: 引数sheet_name
一つのシートを読み込み
引数sheet_nameで読み込むシートを指定できる。0始まりの番号かシート名で指定する。
df_sheet_index = pd.read_excel('data/src/sample.xlsx', sheet_name=0, index_col=0)
print(df_sheet_index)
# A B C
# one 11 12 13
# two 21 22 23
# three 31 32 33
df_sheet_name = pd.read_excel('data/src/sample.xlsx', sheet_name='sheet2', index_col=0)
print(df_sheet_name)
# AA BB CC
# ONE 11 12 13
# TWO 21 22 23
# THREE 31 32 33
複数のシートを読み込み
引数sheet_nameにはリストを指定することも可能。0始まりの番号でもシート名でもOK。
指定した番号またはシート名がキーkey、そのシートのデータpandas.DataFrameが値valueとなる辞書dictとして読み込まれる。
df_sheet_multi = pd.read_excel('data/src/sample.xlsx', sheet_name=[0, 'sheet2'], index_col=0)
print(type(df_sheet_multi))
# <class 'dict'>
print(len(df_sheet_multi))
# 2
print(df_sheet_multi.keys())
# dict_keys([0, 'sheet2'])
読み込み時に番号で指定したシートのキーは番号、シート名で指定したシートのキーはシート名となる。
print(df_sheet_multi[0])
# A B C
# one 11 12 13
# two 21 22 23
# three 31 32 33
print(type(df_sheet_multi[0]))
# <class 'pandas.core.frame.DataFrame'>
print(df_sheet_multi['sheet2'])
# AA BB CC
# ONE 11 12 13
# TWO 21 22 23
# THREE 31 32 33
print(type(df_sheet_multi['sheet2']))
# <class 'pandas.core.frame.DataFrame'>
すべてのシートを読み込み
引数sheet_name=Noneとすると、すべてのシートが読み込まれる。この場合はシート名がキーkeyになる。
df_sheet_all = pd.read_excel('data/src/sample.xlsx', sheet_name=None, index_col=0)
print(type(df_sheet_all))
# <class 'dict'>
print(df_sheet_all.keys())
# dict_keys(['sheet1', 'sheet2'])
ヘッダー、インデックスを指定: 引数header, index_col
ヘッダー(pandas.DataFrameの列名columns)、インデックス(pandas.DataFrameの行名index)とする行や列を指定するには、それぞれ引数header, index_colに0始まりの行番号・列番号を渡す。
header, index_colをNoneとすると特定の行や列がヘッダー、インデックスに使われることはなく、0始まりの連番となる。
df_header_index = pd.read_excel('data/src/sample.xlsx', header=None, index_col=None)
print(df_header_index)
# 0 1 2 3
# 0 NaN A B C
# 1 one 11 12 13
# 2 two 21 22 23
# 3 three 31 32 33
print(df_header_index.columns)
# Int64Index([0, 1, 2, 3], dtype='int64')
print(df_header_index.index)
# RangeIndex(start=0, stop=4, step=1)
デフォルトはheader=0(=最初の行をcolumnsとする)、index_col=None(=どの列もindexとして指定しない)。
df_default = pd.read_excel('data/src/sample.xlsx')
print(df_default)
# Unnamed: 0 A B C
# 0 one 11 12 13
# 1 two 21 22 23
# 2 three 31 32 33
print(df_default.columns)
# Index(['Unnamed: 0', 'A', 'B', 'C'], dtype='object')
print(df_default.index)
# RangeIndex(start=0, stop=3, step=1)
pandasのバージョンが古いと、ヘッダーに指定した行の先頭の要素がNaNだとデフォルト(index_col=None)でも先頭の列がindexとして使われていた(ソースコード未確認なのでどういう処理になっているかは不明)。
先頭列をindexとしたい場合は明示的にindex_col=0としておけばどのバージョンでも安心。
print(pd.read_excel('data/src/sample.xlsx', index_col=0))
# A B C
# one 11 12 13
# two 21 22 23
# three 31 32 33
csvファイルを読み込むread_csv()と同様に引数namesで任意の列名columnsを指定することも可能。詳細は以下の記事を参照。
読み込む列、読み込まない行を指定: 引数usecols, skiprows, skipfooter
すべての行・列を読み込む必要がない場合は、読み込む列、読み込まない行を指定できる。
引数usecolsには読み込む列番号のリスト、引数skiprowsにはスキップする(読み込まない)行番号のリスト、引数skipfooterにはスキップする(読み込まない)末尾の行数を渡す。
df_use_skip = pd.read_excel('data/src/sample.xlsx', index_col=0,
usecols=[0, 1, 3], skiprows=[1], skipfooter=1)
print(df_use_skip)
# A C
# two 21 23
これらの引数もcsvファイルを読み込むread_csv()と同様。詳細は以下の記事を参照。
なお、読み込み時に行や列を処理しなくても、すべて読みこんでから行・列を削除したり任意の位置の要素を参照したりすることももちろん可能。