Skip to content
トピック
Pandas
Pandas Read Excel: PythonでExcelファイルをインポートする方法

Pandas Read Excel: PythonでExcelファイルをインポートする方法

Updated on

Excelファイルは、ビジネス環境で表形式データを保存する最も一般的な形式のままですが、分析のためにPythonにインポートする際にしばしば摩擦が生じます。複数のシート、不整合なデータ型、欠損値、メモリ制約を処理する必要があり、それらすべてをデータ整合性を維持しながら行わなければなりません。pandasのread_excel()関数はこれらの課題を解決しますが、30以上のパラメータを正しく構成する方法を知っている場合のみです。

このガイドでは、基本的な単一シートのインポートから、複数のシートを同時に読み取る、大きなファイルの処理、一般的なエラーのトラブルシューティングなどの高度なシナリオまで、Excelファイルをpandas DataFrameに効率的にインポートする方法を示します。

📚

pandas read_excel()の基本的な使用方法

Excelファイルをpandas DataFrameに読み込む最も簡単な方法は、ファイルパスだけを必要とします。

import pandas as pd
 
# Excelファイルの最初のシートを読み込む
df = pd.read_excel('data.xlsx')
print(df.head())

これはデフォルトで最初のシートを読み取り、最初の行を列ヘッダーとして扱います。関数はファイル形式(.xlsxまたは.xls)を自動的に検出し、適切なエンジンを使用します。

異なるディレクトリ内のファイルの場合は、絶対パスまたは相対パスを使用します。

# 絶対パス
df = pd.read_excel('/Users/username/Documents/sales_data.xlsx')
 
# 相対パス
df = pd.read_excel('../data/sales_data.xlsx')

主要なパラメータの理解

read_excel()関数は、データのインポート方法に関する広範な制御を提供します。最も重要なパラメータの参照表は次のとおりです。

パラメータ説明
sheet_namestr, int, list, None読み取るシートを指定sheet_name='Sales' または sheet_name=0
headerint, list, None列名として使用する行header=0 (デフォルト) または header=None
usecolsstr, list解析する列usecols='A:D' または usecols=[0,1,2]
dtypedict, Type列のデータ型dtype={'ID': str, 'Age': int}
skiprowsint, list先頭でスキップする行skiprows=2 または skiprows=[0,2,5]
nrowsint読み取る行数nrows=1000
na_valuesscalar, str, list, dictNaNとして認識する値na_values=['NA', 'N/A', '']
parse_datesbool, list, dict日付として解析する列parse_dates=['Date']
enginestr使用するExcelエンジンengine='openpyxl' または engine='xlrd'

複数のシートを操作する

特定のシートを読み取る

名前またはインデックス(0ベース)でシートを指定します。

# シート名で読み取る
df = pd.read_excel('financial_report.xlsx', sheet_name='Q1 Revenue')
 
# インデックスで読み取る(0 = 最初のシート)
df = pd.read_excel('financial_report.xlsx', sheet_name=0)

一度に複数のシートを読み取る

シート名またはインデックスのリストを渡して、複数のシートをDataFrameの辞書にインポートします。

# 複数の特定のシートを読み取る
sheets_dict = pd.read_excel('annual_report.xlsx',
                            sheet_name=['Q1', 'Q2', 'Q3', 'Q4'])
 
# 個別のDataFrameにアクセス
q1_df = sheets_dict['Q1']
q2_df = sheets_dict['Q2']
 
print(f"Q1 shape: {q1_df.shape}")
print(f"Q2 shape: {q2_df.shape}")

すべてのシートを読み取る

sheet_name=Noneを使用して、ワークブック内のすべてのシートをインポートします。

# すべてのシートを辞書に読み込む
all_sheets = pd.read_excel('company_data.xlsx', sheet_name=None)
 
# すべてのシートを反復処理
for sheet_name, df in all_sheets.items():
    print(f"\nSheet: {sheet_name}")
    print(f"Shape: {df.shape}")
    print(f"Columns: {df.columns.tolist()}")

これは、類似した構造を持つ複数のシートを処理する必要がある場合に特に便利です。

# すべてのシートを単一のDataFrameに結合
all_sheets = pd.read_excel('monthly_sales.xlsx', sheet_name=None)
combined_df = pd.concat(all_sheets.values(), ignore_index=True)
print(f"Combined shape: {combined_df.shape}")

ヘッダーと列によるデータインポートの制御

ヘッダー行の指定

どの行が列名になるかを制御します。

# 最初の2行をスキップし、3行目をヘッダーとして使用
df = pd.read_excel('data.xlsx', header=2)
 
# ヘッダー行なし - pandasは数値列名を割り当てます
df = pd.read_excel('data.xlsx', header=None)
 
# マルチレベル列ヘッダー
df = pd.read_excel('data.xlsx', header=[0, 1])

行のスキップ

ファイルの先頭から不要な行を削除します。

# 最初の3行をスキップ
df = pd.read_excel('data.xlsx', skiprows=3)
 
# 特定の行をスキップ(0インデックス)
df = pd.read_excel('data.xlsx', skiprows=[0, 2, 5])
 
# 関数を使用して行をスキップ
df = pd.read_excel('data.xlsx', skiprows=lambda x: x % 2 == 0)  # 偶数行をスキップ

特定の列の選択

メモリ使用量を削減するために、必要な列のみをインポートします。

# 文字範囲で列を選択
df = pd.read_excel('data.xlsx', usecols='A:D')
 
# 文字で特定の列を選択
df = pd.read_excel('data.xlsx', usecols='A,C,E,G')
 
# インデックスで列を選択
df = pd.read_excel('data.xlsx', usecols=[0, 2, 4, 6])
 
# 名前で列を選択
df = pd.read_excel('data.xlsx', usecols=['Name', 'Age', 'Salary'])
 
# 関数を使用して列を選択
df = pd.read_excel('data.xlsx', usecols=lambda x: 'total' in x.lower())

データ型の指定と変換

列のデータ型の設定

自動推論エラーを防ぐために、データ型を明示的に定義します。

# 複数の列のdtypesを指定
df = pd.read_excel('customer_data.xlsx',
                   dtype={
                       'CustomerID': str,
                       'ZipCode': str,
                       'Age': int,
                       'Revenue': float
                   })
 
# 先頭のゼロを保持するために数値IDを文字列として保持
df = pd.read_excel('products.xlsx', dtype={'ProductID': str})

日付の処理

日付列を自動的に解析します。

# 単一の日付列を解析
df = pd.read_excel('orders.xlsx', parse_dates=['OrderDate'])
 
# 複数の日付列を解析
df = pd.read_excel('employee_data.xlsx',
                   parse_dates=['HireDate', 'TerminationDate'])
 
# 列を単一のdatetimeに結合
df = pd.read_excel('logs.xlsx',
                   parse_dates={'DateTime': ['Date', 'Time']})
 
# 結果を確認
print(df.dtypes)

欠損値の管理

pandasが欠損データをどのように識別して処理するかを制御します。

# カスタム欠損値インジケーターを認識
df = pd.read_excel('survey_data.xlsx',
                   na_values=['NA', 'N/A', 'null', 'None', '-'])
 
# 列ごとに異なるNA値
df = pd.read_excel('mixed_data.xlsx',
                   na_values={
                       'Age': ['Unknown', 'N/A'],
                       'Salary': [0, -1, 'Not Disclosed']
                   })
 
# デフォルトのNA値を保持し、さらに追加
df = pd.read_excel('data.xlsx',
                   na_values=['Missing'],
                   keep_default_na=True)

大きなExcelファイルの処理

Excelファイルは、RAMに完全にロードされると大量のメモリを消費します。大きなデータセットには次の戦略を使用してください。

行の制限

必要な行のみを読み取ります。

# 最初の10,000行を読み取る
df = pd.read_excel('large_file.xlsx', nrows=10000)
 
# skiprowsとnrowsを使用して特定の行範囲を読み取る
df = pd.read_excel('large_file.xlsx', skiprows=1000, nrows=5000)

メモリ効率のためのコンバーターの使用

インポート中に変換を適用して、メモリフットプリントを削減します。

# 読み取り中に列を変換
def categorize_status(value):
    return 'Active' if value == 1 else 'Inactive'
 
df = pd.read_excel('users.xlsx',
                   converters={
                       'Status': categorize_status,
                       'Category': lambda x: x.lower().strip()
                   })

シートを反復的に処理

複数の大きなシートを持つワークブックの場合は、一度に1つのシートを処理します。

import pandas as pd
 
# 最初にすべてのシート名を取得
xls = pd.ExcelFile('massive_workbook.xlsx')
sheet_names = xls.sheet_names
 
# 各シートを個別に処理
for sheet in sheet_names:
    df = pd.read_excel(xls, sheet_name=sheet, nrows=10000)
    # ここでdfを処理
    result = df.describe()
    print(f"\n{sheet} Summary:\n{result}")

代替案: ストリーミングにopenpyxlを使用

非常に大きなファイルの場合は、openpyxlで行ごとに読み取ることを検討してください。

from openpyxl import load_workbook
 
# 読み取り専用モードでワークブックを読み込む
wb = load_workbook('huge_file.xlsx', read_only=True)
ws = wb['Sheet1']
 
# 行を反復的に処理
data = []
for row in ws.iter_rows(min_row=2, max_row=1000, values_only=True):
    data.append(row)
 
# DataFrameに変換
df = pd.DataFrame(data, columns=['Col1', 'Col2', 'Col3'])
wb.close()

Excelエンジンの理解

Pandasは、形式とインストールされたパッケージに応じて、異なるライブラリを使用してExcelファイルを読み取ります。

エンジンファイル形式インストール使用例
openpyxl.xlsxpip install openpyxl最新のExcelファイル(Excel 2010+)、.xlsxのデフォルト
xlrd.xls, .xlsxpip install xlrdレガシー.xlsファイル(Excel 2003)、.xlsxでは非推奨
pyxlsb.xlsbpip install pyxlsbバイナリExcelファイル
odf.odspip install odfpyOpenDocumentスプレッドシート

エンジンを明示的に指定します。

# openpyxlエンジンを強制
df = pd.read_excel('data.xlsx', engine='openpyxl')
 
# レガシー.xlsファイルを読み取る
df = pd.read_excel('old_data.xls', engine='xlrd')
 
# バイナリExcelファイルを読み取る
df = pd.read_excel('data.xlsb', engine='pyxlsb')

Pandas read_excel vs read_csv: 主な違い

両方の関数はDataFrameを作成しますが、重要な違いがあります。

機能read_excel()read_csv()
ファイル形式バイナリExcelファイル(.xlsx, .xls)プレーンテキストCSVファイル
速度遅い(複雑な形式の解析)速い(単純なテキスト解析)
依存関係openpyxl/xlrdが必要追加の依存関係なし
複数のシートはい(sheet_nameパラメータ)いいえ(単一ファイルのみ)
フォーマットされたデータ一部のExcel書式を保持書式なし(プレーンテキスト)
メモリ使用量高い(バイナリ解析オーバーヘッド)低い(テキストストリーミング)
数式計算された値のみを読み取るN/A
日付解析Excelの日付を自動変換parse_datesが必要
大きなファイルメモリ集約的chunksizeパラメータをサポート
最適な用途ビジネスデータ、マルチシートレポート大規模データセット、データエクスポート

推奨: 大規模なデータ処理にはread_csv()を使用し、既存のExcelワークブックまたは複数のシートを操作する必要がある場合はread_excel()を使用してください。

PyGWalkerでExcelデータを即座に視覚化

pandasでExcelデータをインポートした後、それを視覚的に探索する必要があることがよくあります。PyGWalker (opens in a new tab)は、DataFrameをJupyterノートブック内で直接Tableauのようなインタラクティブな視覚化インターフェイスに変換します。プロットコードを書く必要はありません。

import pandas as pd
import pygwalker as pyg
 
# Excelデータを読み取る
df = pd.read_excel('sales_data.xlsx')
 
# インタラクティブな視覚化を起動
pyg.walk(df)

これにより、次のことができるドラッグアンドドロップインターフェイスが開きます。

  • 列をビジュアルチャネルにドラッグしてチャートを作成
  • チャートタイプ(棒、線、散布図、ヒートマップ)を即座に切り替え
  • フィルタと集計をインタラクティブに適用
  • 視覚化を画像またはコードとしてエクスポート

PyGWalkerは、Excelファイルをインポートした後の探索的データ分析に特に便利で、matplotlibやseabornコードを書くことなくデータの分布や関係を理解できます。

一般的なエラーとトラブルシューティング

ModuleNotFoundError: No module named 'openpyxl'

これは.xlsxファイルを読み取る際の最も一般的なエラーです。

ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to install openpyxl.

解決策: 必要なエンジンをインストールします。

# openpyxlをインストール
pip install openpyxl
 
# またはすべてのExcel依存関係をインストール
pip install pandas[excel]

XLRDError: Excel xlsx file; not supported

このエラーが表示される場合、xlrdは.xlsxファイルを読み取ろうとしています(バージョン2.0以降は.xlsのみをサポート)。

解決策: openpyxlをインストールするか、エンジンを指定します。

df = pd.read_excel('data.xlsx', engine='openpyxl')

FileNotFoundError

ファイルパスと作業ディレクトリを確認してください。

import os
 
# 現在のディレクトリを出力
print(os.getcwd())
 
# ディレクトリ内のファイルをリスト
print(os.listdir('.'))
 
# 絶対パスを使用
df = pd.read_excel('/absolute/path/to/file.xlsx')

大きなファイルでのメモリエラー

pandasがメモリエラーでクラッシュする場合:

# 列を選択してメモリを削減
df = pd.read_excel('large_file.xlsx', usecols=['A', 'B', 'C'])
 
# 行を制限
df = pd.read_excel('large_file.xlsx', nrows=50000)
 
# dtypesを指定してメモリを削減
df = pd.read_excel('large_file.xlsx',
                   dtype={'ID': 'int32', 'Category': 'category'})

ValueError: Excel file format cannot be determined

これは、ファイル拡張子が実際の形式と一致しない場合に発生します。

解決策: エンジンを明示的に指定するか、正しい拡張子でファイル名を変更します。

# 異なるエンジンを試す
df = pd.read_excel('data.xlsx', engine='openpyxl')

日付解析の問題

Excelは日付をシリアル番号として保存します。日付が正しく解析されない場合:

# 日付解析を強制
df = pd.read_excel('data.xlsx', parse_dates=['DateColumn'])
 
# 手動変換
df['DateColumn'] = pd.to_datetime(df['DateColumn'])

高度なテクニック

パスワード保護されたファイルの読み取り

pandasはパスワード保護されたファイルを直接サポートしていませんが、msoffcrypto-toolを使用します。

import msoffcrypto
import io
import pandas as pd
 
# ファイルを復号化
decrypted = io.BytesIO()
with open('protected.xlsx', 'rb') as f:
    file = msoffcrypto.OfficeFile(f)
    file.load_key(password='yourpassword')
    file.decrypt(decrypted)
 
# 復号化されたファイルを読み取る
df = pd.read_excel(decrypted)

read_excelをコンテキストマネージャーと組み合わせる

リソース管理を改善するため:

from contextlib import closing
import pandas as pd
 
with closing(pd.ExcelFile('data.xlsx')) as xls:
    df1 = pd.read_excel(xls, sheet_name='Sheet1')
    df2 = pd.read_excel(xls, sheet_name='Sheet2')
    # このブロックの後、ファイルは自動的に閉じられます

URLの操作

URLから直接Excelファイルを読み取ります。

url = 'https://example.com/data.xlsx'
df = pd.read_excel(url)

ExcelデータデバッグにRunCellを使用

Jupyterノートブックで複雑なExcelインポートを操作する場合、RunCell (opens in a new tab)はインポートエラーのデバッグ、パラメータの最適化、データ型の問題の修正にAIを活用した支援を提供します。AIエージェントは次のことができます。

  • read_excel()が日付を正しく解析しない理由を診断
  • メモリ効率のための最適なdtype仕様を提案
  • エンジンの互換性の問題をデバッグ
  • エンコーディングとフォーマットの問題のトラブルシューティングを支援

これは、一貫性のないフォーマットや複雑なマルチシート構造を持つ実際のExcelファイルをインポートする際に特に価値があります。

FAQ

pandasでヘッダーなしのExcelファイルを読み取るにはどうすればよいですか?

header=Noneを設定して、最初の行がデータであり列名ではないことをpandasに伝えます。Pandasは数値列名(0、1、2...)を割り当てます。

df = pd.read_excel('data.xlsx', header=None)

その後、手動で列名を変更できます。

df.columns = ['Name', 'Age', 'Salary']

pandasは複数のExcelファイルを一度に読み取ることができますか?

はい、ループまたはリスト内包表記を使用して複数のファイルを読み取り、連結します。

import pandas as pd
from glob import glob
 
# ディレクトリ内のすべてのExcelファイルを読み取る
files = glob('data/*.xlsx')
dfs = [pd.read_excel(f) for f in files]
combined_df = pd.concat(dfs, ignore_index=True)

Excelファイルから特定の行のみを読み取るにはどうすればよいですか?

skiprowsnrowsパラメータを組み合わせます。

# 行100-199を読み取る(最初の100行をスキップ、次の100行を読み取る)
df = pd.read_excel('data.xlsx', skiprows=100, nrows=100)

read_excelはread_csvと比較してなぜそんなに遅いのですか?

Excelファイルは複雑な解析を必要とするバイナリ形式ですが、CSVファイルはプレーンテキストです。大きなデータセットの場合は、最初にExcelをCSVに変換します。

# 1回限りの変換
df = pd.read_excel('large_file.xlsx')
df.to_csv('large_file.csv', index=False)
 
# 今後の読み取りはCSVを使用
df = pd.read_csv('large_file.csv')  # はるかに高速

Excelファイルの結合セルを処理するにはどうすればよいですか?

Pandasは結合セルの左上の値を読み取り、残りをNaNで埋めます。これらの値を前方に埋めることができます。

df = pd.read_excel('data.xlsx')
df['MergedColumn'] = df['MergedColumn'].fillna(method='ffill')

まとめ

pandas read_excel()関数は、単純な単一シートのインポートから、複数のシート、カスタムデータ型、大きなファイル処理を含む複雑なシナリオまで、PythonへのExcelファイルのインポートに関する包括的な制御を提供します。データを効率的かつ正確にインポートするために、sheet_nameusecolsdtypeparse_datesskiprowsなどの主要なパラメータをマスターしてください。

ほとんどのワークフローでは、基本的なpd.read_excel('file.xlsx')で十分ですが、実際のビジネスデータを操作する場合、エンジンの選択、コンバーター関数、メモリ最適化技術などの高度なオプションを理解することが重要になります。適切なエンジン(.xlsxファイルの場合はopenpyxl)をインストールし、パフォーマンスを向上させるために大きなExcelファイルをCSVに変換することを検討してください。

データインポートにpandas、即座の視覚化にPyGWalker、デバッグにRunCellを組み合わせることで、PythonでのExcelデータ分析のための強力なワークフローが作成されます。

📚