この記事では、PythonでExcelファイルを読み込んで使用する方法を解説します。
他の形式のファイルを扱うには以下の記事を参照してください。
CSVファイルを読み書きする方法 |
open関数を使ってファイルを読み書きする方法を解説 |
一時ファイルを扱う方法 |
また、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ファイルを読み込むには、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 男