pandasでExcelファイル(xlsx, xls)の読み込み(read_excel)

Modified: | Tags: Python, pandas, Excel

pandasでExcelファイル(拡張子:.xlsx, .xls)をpandas.DataFrameとして読み込むには、pandas.read_excel()関数を使う。

ここでは以下の内容について説明する。

  • openpyxl, xlrdのインストール
  • pandas.read_excel()の基本的な使い方
  • 読み込むシートを番号・シート名で指定: 引数sheet_name
    • 一つのシートを読み込み
    • 複数のシートを読み込み
    • すべてのシートを読み込み
  • ヘッダー、インデックスを指定: 引数header, index_col
  • 読み込む列、読み込まない行を指定: 引数usecols, skiprows, skipfooter

以下のxlsxファイルを例とする。

sheet1sheet2の二つのシートを持つ。それぞれの中身は以下の通り。

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ファイルの読み書き(入出力)については以下の記事を参照。

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_colNoneとすると特定の行や列がヘッダー、インデックスに使われることはなく、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()と同様。詳細は以下の記事を参照。

なお、読み込み時に行や列を処理しなくても、すべて読みこんでから行・列を削除したり任意の位置の要素を参照したりすることももちろん可能。

関連カテゴリー

関連記事