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()
と同様。詳細は以下の記事を参照。
なお、読み込み時に行や列を処理しなくても、すべて読みこんでから行・列を削除したり任意の位置の要素を参照したりすることももちろん可能。