Open1
PythonでのExcel内のデータを検索する時の順序

主なExcel操作ライブラリと検索順序
1. pandas を使った場合
import pandas as pd
# Excelファイルを読み込む
df = pd.read_excel('example.xlsx')
# 特定の値を検索
result = df[df == '検索したい値']
# または
mask = df.isin(['値1', '値2'])
result = df[mask]
検索順序:
- pandasは内部的にはデータを行単位で処理します
- DataFrame全体をスキャンする際は、基本的に「行→列」の順(行ごとに左から右へ)
- これは、データがメモリ上で行方向に連続して格納されているため効率的
2. openpyxl を使った場合
from openpyxl import load_workbook
wb = load_workbook('example.xlsx')
ws = wb.active
# すべてのセルを走査して特定の値を検索(明示的な二重ループ)
for row in ws.iter_rows():
for cell in row:
if cell.value == '検索したい値':
print(f"Found at {cell.coordinate}")
検索順序:
- 明示的なループを書く場合、あなたが指定した順序で検索します
-
iter_rows()
→ 行ごとに処理(A1, B1, C1...から始まり、次に A2, B2, C2...) -
iter_cols()
→ 列ごとに処理(A1, A2, A3...から始まり、次に B1, B2, B3...)
なぜ「行方向」が基本なのか?
コンピュータのメモリ上では、二次元データ(表)は実際には一次元の配列として格納されます。
その格納方法には2種類あります:
-
行優先(Row-major): 行が連続して格納される方式(C, Python, Javaなど)
[A1, B1, C1, A2, B2, C2, ...]
-
列優先(Column-major): 列が連続して格納される方式(Fortran, Rなど)
[A1, A2, A3, B1, B2, B3, ...]
パフォーマンスへの影響
- 行方向のスキャン:メモリアクセスが連続的で高速
- 列方向のスキャン:メモリアクセスが不連続で遅くなる可能性がある
大量データを効率的に検索したい場合
import pandas as pd
df = pd.read_excel('large_file.xlsx')
# 方法1: 条件マスクを使う(全データをスキャン)
result = df[df['特定の列'] == '検索値']
# 方法2: 特定の列にインデックスを設定して検索(より効率的)
df.set_index('特定の列', inplace=True)
result = df.loc['検索値']
特定のパターンに一致する値を検索
# 正規表現を使った検索
import re
pattern = re.compile(r'(\d{3}-\d{4})') # 例: 郵便番号パターン
# pandasの場合
mask = df['住所'].str.contains(pattern)
matches = df[mask]
# openpyxlの場合
for row in ws.iter_rows():
for cell in row:
if cell.value and isinstance(cell.value, str):
if pattern.search(cell.value):
print(f"Match found at {cell.coordinate}")
-
検索対象が明確な場合: 特定の列や範囲に絞って検索すると効率的
# 特定の列だけを検索 column_data = df['特定の列'] matches = column_data[column_data == '検索値']
-
複数条件の検索: 論理演算子を使って複合条件で検索
# AND条件 result = df[(df['列1'] > 100) & (df['列2'] == '対象')] # OR条件 result = df[(df['列1'] == 'A') | (df['列1'] == 'B')]
-
大きなファイルの一部だけ読み込む: 必要な範囲だけを指定
# 特定の列だけ読み込む df = pd.read_excel('large_file.xlsx', usecols=['必要な列1', '必要な列2']) # 特定の行数だけ読み込む df = pd.read_excel('large_file.xlsx', nrows=1000)
まとめ
PythonでのExcelデータ検索は、使用するライブラリによって内部的な順序が異なりますが、基本的には行優先で処理されることが多いです。これはPythonの内部データ構造が行優先(Row-major)であることに関連しています。