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

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

pandas.read_excel — pandas 0.22.0 documentation

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

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

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

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

xlrdのインストール

pandas.read_excel()では内部でxlrdというライブラリを使っている。 xlrdはPythonでExcelファイル(.xlsx, .xls)の読み込み(入力)を行うためのライブラリ。

xlrdがインストールされていない環境でpandas.read_excel()を呼ぶと、以下のようなエラーメッセージが表示される。 ImportError: Install xlrd >= 0.9.0 for Excel support

xlrdはpipでインストールできます。(環境によってはpip3)

$ pip install xlrd

pandas.read_excel()の基本的な使い方

第一引数ioにExcelファイルのパスまたはURLを指定します。 複数のシートがある場合、最初のシートのみがpandas.DataFrameとして読み込まれる。

import pandas as pd

df = pd.read_excel('data/src/sample.xlsx')

print(df)
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

例は.xlsxファイル(Excel2007以降のExcelファイル)を読み込んでいるが、.xlsファイル(Excel97-2003のExcelファイル)でも同様。

読み込むシートを番号・シート名で指定: 引数sheet_name

引数sheet_nameで読み込むシートを指定できます。0始まりの番号かシート名で指定します。

df_sheet_index = pd.read_excel('data/src/sample.xlsx', sheet_name=1)

print(df_sheet_index)
#        AA  BB  CC
# 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')

print(df_sheet_name)
#        AA  BB  CC
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

複数のシートを読み込み

引数sheet_nameにはリストを指定することも可能。0始まりの番号でもシート名でも問題ありません。 指定した番号またはシート名がキーkey、そのシートのデータpandas.DataFrameが値valueとなる順序付き辞書OrderedDictとして読み込まれる。

df_sheet_multi = pd.read_excel('data/src/sample.xlsx', sheet_name=[0, 'sheet2'])

print(df_sheet_multi)
# OrderedDict([(0,         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)])

print(type(df_sheet_multi))
# <class 'collections.OrderedDict'>

print(len(df_sheet_multi))
# 2

OrderedDictは要素の順番を保持した辞書。

辞書dictと同様にキーで値を参照できます。 読み込み時に番号で指定したシートのキーは番号、シート名で指定したシートのキーはシート名となります。

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とすると、すべてのシートが読み込まれる。

df_sheet_all = pd.read_excel('data/src/sample.xlsx', sheet_name=None)

print(df_sheet_all)
# OrderedDict([('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)])

この場合はシート名がキーkeyになる。

print(df_sheet_all['sheet1'])
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

print(type(df_sheet_all['sheet1']))
# <class 'pandas.core.frame.DataFrame'>

print(df_sheet_all['sheet2'])
#        AA  BB  CC
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

print(type(df_sheet_all['sheet2']))
# <class 'pandas.core.frame.DataFrame'>

ヘッダー、インデックスを指定: 引数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として指定しない)。 ただし、これまでの例のように、ヘッダーに指定した行の先頭の要素がNaNだとデフォルトのindex_col=Noneでも先頭の列がindexとして使われる模様(ソースコード未確認なのでどういう処理になっているかは不明)。

df_default = pd.read_excel('data/src/sample.xlsx', index_col=None)

print(df_default)
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

print(df_default.columns)
# Index(['A', 'B', 'C'], dtype='object')

print(df_default.index)
# Index(['one', 'two', 'three'], dtype='object')

先頭列を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', usecols=[0, 1, 3], skiprows=[1], skipfooter=1)

print(df_use_skip)
#       A   C
# two  21  23

これらの引数もcsvファイルを読み込むread_csv()と同様。詳細は以下の記事を参照。

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

シェア

関連カテゴリー

Python pandas Excel

pandasでExcelファイル(xlsx, xls)の書き込み(to_excel) pandas.DataFrameの行番号、列番号を取得 pandasで分位数・パーセンタイルを取得するquantile pandasでクリップボードの中身をDataFrameとして取得するread_clipboard pandas.DataFrameから条件を満たす行名・列名の行・列を抽出(選択) pandasで行・列ごとの最頻値を取得するmode pandas.DataFrameの行・列を指定して削除するdrop pandas.DataFrameの構造とその作成方法 pandasで日付・時間の列を処理(文字列変換、年月日抽出など) Python, pandas, seabornでペアプロット図(散布図行列)を作成 pandasのデータ型dtype一覧とastypeによる変換(キャスト) pandas.DataFrame, Seriesを時系列データとして処理 pandasのcrosstabでクロス集計(カテゴリ毎の出現回数・頻度を算出) pandasで中央値を取得するmedian pandasで窓関数を適用するrollingを使って移動平均などを算出

Last Updated: 6/26/2019, 10:34:03 PM