ホーム > python > pandas > Python pandasでExcelファイル読み込み(DataFrame形式でデータ取得)

Python pandasでExcelファイル読み込み(DataFrame形式でデータ取得)

pythonpandas

使用データ

csvの時同様e-Statから適当にデータをとってきて使用させていただきます。
国勢調査 / 令和2年国勢調査 / 速報集計 人口速報集計 (男女別人口及び世帯総数) 開くとこの様なデータになっています。
20230106104500

このデータをpandasのread_excel()を使って読み取ってみます。



事前準備

read_excel()は内部ではファイル形式に合わせていくつかのライブラリを使用しています。

engine:str, default None
If io is not a buffer or path, this must be set to identify io. Supported engines: “xlrd”, “openpyxl”, “odf”, “pyxlsb”. Engine compatibility :
“xlrd” supports old-style Excel files (.xls).
“openpyxl” supports newer Excel file formats.
“odf” supports OpenDocument file formats (.odf, .ods, .odt).
“pyxlsb” supports Binary Excel files.

公式ドキュメントより引用

大抵の場合.xlsと.xlsxが読み込めればいいと思うので、とりあえずopenpyxlとxlrdをインストールしておけば十分でしょう。

pip install openpyxl
pip install xlrd

anacondaを使っている場合は下記などでインストール可能です。
ANACONDA.ORGで検索するといくつかパッケージが見つかります。

conda install -c conda-forge openpyxl
conda install -c conda-forge xlrd


基本的な使い方

基本的には引数のioにExcelファイルのパスを指定するだけで読み取りが可能です。

import pandas as pd
if __name__ == '__main__':
df = pd.read_excel('a01.xlsx')
print(df)

今回の場合、読み取ると下記のようになっています。
これだと使いにくいので、色々試していきます。
20230106113600



ヘッダー行、インデックス行の指定

引数のheader、index_colに0始まりの行番号、列番号を指定することで、ヘッダー/インデックスとして使用することが出来ます。
また、この2つはリストで指定することが可能です。今回のファイルは少し複雑な構造になっているのでリストで指定してみます。

import pandas as pd
if __name__ == '__main__':
df = pd.read_excel('a01.xlsx', header=[8,9,10,11,12], index_col=[0,1,2])
print(df)

結果は下記のようになります。

20230106134700



独自のヘッダーを指定

上記の様なデータが扱いにくい場合は、独自のヘッダーを指定することも可能です。
例えば、D、E列に「人口男女総数」「人口男女男」と指定して取得してみます。

import pandas as pd
if __name__ == '__main__':
df = pd.read_excel('a01.xlsx',
names=['人口男女_総数', '人口男女_男'],
usecols=[3,4],
skiprows=12)
print(df)

下記のように取得できます。
20230106135700



シートの指定

今回のデータはシートが1つしかなかったので指定する必要がありませんでしたが、複数が存在する場合「特定のシートのデータのみ取得」「複数シートのデータを取得」といったことも可能です。 サンプルファイルを用意して試してみます。
■Sheet1

col0_sheet1col1_sheet1
03
14
25

■Sheet2

col0_sheet2col1_sheet2
03
14
25
import pandas as pd
if __name__ == '__main__':
# Sheet1データ取得
df_sheet1 = pd.read_excel('sample.xlsx', sheet_name='Sheet1')
print(df_sheet1)
# 出力結果
# col0_sheet1 col1_sheet1
# 0 0 3
# 1 1 4
# 2 2 5
# Sheet2データ取得
df_sheet2 = pd.read_excel('sample.xlsx', sheet_name='Sheet2')
print(df_sheet2)
# 出力結果
# col0_sheet2 col1_sheet2
# 0 0 3
# 1 1 4
# 2 2 5
# Sheet1,Sheet2データ取得(シート名で指定)
df_sheetall = pd.read_excel('sample.xlsx', sheet_name=['Sheet1','Sheet2'])
print(df_sheetall)
# 出力結果
# {'Sheet1':
# col0_sheet1 col1_sheet1
# 0 0 3
# 1 1 4
# 2 2 5,
# 'Sheet2':
# col0_sheet2 col1_sheet2
# 0 0 3
# 1 1 4
# 2 2 5}
# Sheet1,Sheet2データ取得(番号で指定)
df_sheetall2 = pd.read_excel('sample.xlsx', sheet_name=[0, 1])
print(df_sheetall2)
# 出力結果
# {'Sheet1':
# col0_sheet1 col1_sheet1
# 0 0 3
# 1 1 4
# 2 2 5,
# 'Sheet2':
# col0_sheet2 col1_sheet2
# 0 0 3
# 1 1 4
# 2 2 5}

複数シートのデータを取得した場合、辞書型で取得することが出来るので、下記の様にDataFrameを取得することが可能です。

import pandas as pd
if __name__ == '__main__':
# Sheet1,Sheet2データ取得(シート名で指定)
df_sheetall = pd.read_excel('sample.xlsx', sheet_name=['Sheet1','Sheet2'])
print(df_sheetall)
# 出力結果
# 上記同様
# DataFrame取得
df_sheetall_ex = df_sheetall['Sheet1']
print(df_sheetall_ex)
# 出力結果
# col0_sheet1 col1_sheet1
# 0 0 3
# 1 1 4
# 2 2 5
# Sheet1,Sheet2データ取得(番号で指定)
df_sheetall2 = pd.read_excel('sample.xlsx', sheet_name=[0, 1])
print(df_sheetall2)
# 出力結果
# 上記同様
# DataFrame取得
df_sheetall2_ex = df_sheetall2[0]
print(df_sheetall2_ex)
# 出力結果
# col0_sheet1 col1_sheet1
# 0 0 3
# 1 1 4
# 2 2 5