note.nkmk.me

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

Date: 2018-05-06 / tags: Python, pandas, Excel
このエントリーをはてなブックマークに追加

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

Excelファイルの書き込みについては以下の記事を参照

csvファイルの読み書き(入出力)については以下の記事を参照。

PythonでのExcelファイルの扱いについては以下の記事を参照。

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

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

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

sheet1sheet2の二つのワークシートを持つ。sheet1の中身は以下の通り。

    A   B   C
one 11  12  13
two 21  22  23
three   31  32  33

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'>

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

辞書dictと同様にキーで値を参照できる。

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)])

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

シート名がキー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'>

ヘッダー、インデックスの指定: 引数header, index_col

ヘッダー(pandas.DataFrameの列名columns)、インデックス(pandas.DataFrameの行名index)を指定するには、それぞれ引数header, index_colに0始まりの行番号または列番号を渡す。Noneの場合はデフォルトの0始まりの連番となる。

df_header_index = pd.read_excel('data/src/sample.xlsx', header=None, index_col=1)

print(df_header_index)
#         0   2   3
# 1                
# A     NaN   B   C
# 11    one  12  13
# 21    two  22  23
# 31  three  32  33

print(df_header_index.index)
# Index(['A', 11, 21, 31], dtype='object', name=1)

print(df_header_index.columns)
# Int64Index([0, 2, 3], dtype='int64')

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

読み込む列、読み込まない行を指定: 引数usecols, skiprows, skip_footer

すべての行・列を読み込む必要がない場合は、読み込む列、読み込まない行を指定することが可能。

引数usecolsには読み込む列番号のリスト、引数skiprowsにはスキップする(読み込まない)行番号のリスト、引数skip_footerにはスキップする(読み込まない)末尾の行数を渡す。

df_use_skip = pd.read_excel('data/src/sample.xlsx', usecols=[0, 1, 3], skiprows=[1], skip_footer=1)

print(df_use_skip)
#       A   C
# two  21  23

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

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

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事