Categories: Python

【Python】Excelファイルを読み込む方法

この記事では、PythonでExcelファイルを読み込んで使用する方法を解説します。

他の形式のファイルを扱うには以下の記事を参照してください。

また、Excelファイルを書き込む方法は以下の記事を参照してください。

Excelファイルを書き込む方法

Excelファイルの準備

まずは、今回使用するExcelファイルを準備します。
Numbersで以下のような「シート1」を作成します。

id name age gender
1 山口 諒 41
2 鈴木 まどか 18
3 坂本 淳一 23
4 松本 詩織 32
5 古賀 小百合 56

シートを作成したら保存(command + s)してExcelファイルとして書き出します。

ライブラリのインストール

PythonでExcelファイルを読み込むには、pandasを使います。まだ、インストールしてない方は以下のようにインストールしましょう!

$ pip install pandas

依存関係としてopenpyxlも必要となります。

$ pip install openpyxl

インポート

ソースコードの先頭でpandasをインポートします。

import pandas as pd

asを使って「pd」と別名を付けて使用されることが多いです。

Excelファイルを読み込む

Excelファイルを読み込むには、pandas.ExcelFile()を使います。引数に読み込みたいExcelファイルのパスを指定することでそのExcelファイルをExcelFileクラスとしてラップすることができます。

import pandas as pd

file_name = 'data.xlsx'
xlsx = pd.ExcelFile(file_name)

ExcelFileクラスは使用後にclose()を使って閉じる必要がある。

import pandas as pd

file_name = 'data.xlsx'
xlsx = pd.ExcelFile(file_name)

# 何かしらの処理

xlsx.close() # 使い終わったら閉じる

また、with文を使用することもできる。

import pandas as pd

with pd.ExcelFile(file_name) as xlsx:
    ・
    ・
    ・

シートを読み込む

シートを読み込むには先ほど生成したExcelFileクラスのインスタンスからparse()を呼び出すことで読み込むことができる。その際、引数に読み込むシート名を指定する。

file_name = 'data.xlsx'
xlsx = pd.ExcelFile(file_name)

sheet_df = xlsx.parse('シート1')

ExcelFile.sheet_namesで読み込んでいるExcelファイルの全てのシート名をリストで取得することができる。それを利用してシートを読み込む方法もある。

sheet_df = xlsx.parse(xlsx.sheet_names[0])

ExcelFileクラスのインスタンスを生成せずにシートのみを読み込む方法もある。特定のシートだけを読み込みたい場合は、pandas.read_excel()を使った方がお手軽です。

file_name = 'data.xlsx'
sheet_df = pd.read_excel(file_name, sheet_name='シート1')

要素を取得する

シートを読み込むことができたので今度はシートから必要なデータを取得しましょう!

先頭、または末尾から任意の行を取得

引数に指定した行数だけ先頭からはhead()、末尾からはtail()で取得することができる。

sheet_df.head(2)  # 読み込んだシートの先頭2行を表示
sheet_df.tail(2)  # 読み込んだシートの末尾2行を表示

実行結果

   id    name  age gender
0   1    山口 諒   41      男
1   2  鈴木 まどか   18      女

   id    name  age gender
3   4   松本 詩織   32      女
4   5  古賀 小百合   56      女

行ラベル、または列ラベルの取得

行ラベルをindex.values、列ラベルをcolumns.valuesで取得できる。型はnumpy.ndarrayとなっている。

sheet_df.index.values
sheet_df.columns.values

実行結果

[0 1 2 3 4]
['id' 'name' 'age' 'gender']

tolist()でリストとして取得できる。

sheet_df.index.values.tolist()
sheet_df.columns.values.tolist()

実行結果

[0, 1, 2, 3, 4]
['id', 'name', 'age', 'gender']

また、シートを読み込む際にindex_col引数を指定することでindexラベルを変更できる。

sheet_df = xlsx.parse(xlsx.sheet_names[0], index_col=1)

sheet_df.index.values.tolist()

実行結果

['山口 諒', '鈴木 まどか', '坂本 淳一', '松本 詩織', '古賀 小百合']

行と列を指定して要素を取得

atで行名(index)と列名(columns)で要素を取得できます。

# indexが1のnameを取得
sheet_df.at[1, 'name']

実行結果

鈴木 まどか

iatで行番号と列番号で要素を取得できる。

# 0行目の1列目
sheet_df.iat[0, 1]

実行結果

山口 諒

これらでアクセスした場合、代入が可能。

sheet_df.iat[0, 1] = 'Bob'
print(sheet_df.iat[0, 1])

実行結果

Bob

列の取得

列は列名で取得することができる。

sheet_df['name']

実行結果

0      山口 諒
1    鈴木 まどか
2     坂本 淳一
3     松本 詩織
4    古賀 小百合
Name: name, dtype: object

属性のように指定することも可能。ただし、メソッドと名前が被っていると呼び出せない。

sheet_df.name

tolist()でリストとして取得できる。

sheet_df['name'].tolist()

実行結果

['山口 諒', '鈴木 まどか', '坂本 淳一', '松本 詩織', '古賀 小百合']

範囲を指定して任意の列の要素を取得

locを使うことでスライスを使って範囲を指定して要素を取得することができる。

sheet_df.loc[0:2, 'name']

実行結果

0      山口 諒
1    鈴木 まどか
2     坂本 淳一
Name: name, dtype: object

こちらもtolist()でリストとして取得可能。

sheet_df.loc[0:2, 'name'].tolist()

実行結果

['山口 諒', '鈴木 まどか', '坂本 淳一']

任意の範囲の要素を取得

スライスで任意の範囲インデックスを指定することでその範囲内の要素のみを取得できる。

sheet_df[0:3]

実行結果

   id    name  age gender
0   1    山口 諒   41      男
1   2  鈴木 まどか   18      女
2   3   坂本 淳一   23      男

インデックスを変更して行うことも可能。

sheet_df = xlsx.parse(xlsx.sheet_names[0], index_col=1)
sheet_df['山口 諒':'坂本 淳一']

実行結果

        id  age gender
name                  
山口 諒     1   41      男
鈴木 まどか   2   18      女
坂本 淳一    3   23      男
Tags: Excel
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago