ExcelをPython(openpyxl)で操作する - PandasのDataFrameに変換

ExcelをPython(openpyxl)で操作する - PandasのDataFrameに変換
Page content

以前、openpyxl を使ってExcelファイルの操作に関する記事をいくつか書きました。

今回はExcelのデータを Pandas のデータ形式に変換する方法を紹介します。

なぜ Pandas かというと、 Pandas によって、様々な データ分析のための処理を簡単に行える からです。

事前準備

モジュールのインストール

まずは必要なモジュールをインストールします。

pip install openpyxl pandas

サンプルデータの準備

次にサンプルデータを準備します。今回は以下のようなデータを持った sample.xlsx を作成します。

1行目にヘッダ行が ない 以下のような no_headerシートと

no_header_sample_sheet

1行目にヘッダ行が あるsample シートを準備します。

sample_sheet

openpyxl から PandasのDataFrameへ変換

では早速、openpyxl でシートのデータを読み取り、 DataFrame に変換しましょう。

DataFrame は、Pandas 上で2次元のデータを表す場合に使います。 Excelのデータは行と列の2次元データなので、openpyxlWorksheet オブジェクトを DataFrame オブジェクトに変換するイメージです。

ヘッダー行なしデータの場合

ヘッダー行のないシートの場合には、 DataFramews.values を渡すだけでできます。

from openpyxl import load_workbook
import pandas as pd

# ワークブックを読み込む
wb = load_workbook('sample.xlsx')
# no_headerシートにアクセスする
ws = wb['no_header']

# value値をDataFrameに変換
df = pd.DataFrame(ws.values)

変換できているか確認してみましょう。

# DataFrame内の最初の3行のみ表示
df.head(3)
0 1 2
0 1 小林
1 2 田中
2 3 鈴木

ヘッダー行がないので、列番号がヘッダーとして表示されます。

ヘッダー行ありデータの場合

ヘッダー行ありのデータの場合には少し、処理を追加する必要があります。 DataFrame 作成時に columns オプションを指定することで、カラム名を与える事ができます。

このとき、 columns オプションに与える配列の長さ(=列の数)と、DataFrame 生成時の実体データの配列の長さ(=列の数)は 等しい必要があります。

from openpyxl import load_workbook
import pandas as pd

wb = load_workbook('sample.xlsx')
ws = wb['sample']

data = ws.values
# 最初の行をヘッダーとして取得する
columns = next(data)[0:]
# 以降のデータからDataFrameを作成する
df = pd.DataFrame(data, columns=columns)

同様に結果を見てみましょう。

# DataFrame内の最初の3行のみ表示
df.head(3)
ID 名前 性別
0 1 小林
1 2 田中
2 3 鈴木

きちんとヘッダー名も表示されました。

PandasでExcelファイルを読み込む

先程は openpyxl で読み込んだデータを DataFrame に変換しました。

実はこの操作は Pandasread_excel 関数を使うことで同様の処理ができます。

内部的には xlrdopenpyxl に依存しているので、モジュールのインストールが必要です。

pip install openpyxl pandas xlrd

以下のように read_excel 関数を呼び出すだけで完了です。

import pandas as pd

df = pd.read_excel('sample.xlsx', sheet_name='sample')
df.head()

まとめ

Excelのデータを PandasDataFrame として扱う方法を紹介しました。 openpyxlWorksheet オブジェクトから DataFrame へ変換する方法もあれば、Pandasread_excel 関数を用いる方法もあります。

特にこだわりがないのであれば、 read_excel 関数を使った方がシンプルだと思います。

関連記事

soudegesu avatar
About soudegesu
Software Engineer
comments powered by Disqus