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種類あります:

  1. 行優先(Row-major): 行が連続して格納される方式(C, Python, Javaなど)

    [A1, B1, C1, A2, B2, C2, ...]
    
  2. 列優先(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}")
  1. 検索対象が明確な場合: 特定の列や範囲に絞って検索すると効率的

    # 特定の列だけを検索
    column_data = df['特定の列']
    matches = column_data[column_data == '検索値']
    
  2. 複数条件の検索: 論理演算子を使って複合条件で検索

    # AND条件
    result = df[(df['列1'] > 100) & (df['列2'] == '対象')]
    
    # OR条件
    result = df[(df['列1'] == 'A') | (df['列1'] == 'B')]
    
  3. 大きなファイルの一部だけ読み込む: 必要な範囲だけを指定

    # 特定の列だけ読み込む
    df = pd.read_excel('large_file.xlsx', usecols=['必要な列1', '必要な列2'])
    
    # 特定の行数だけ読み込む
    df = pd.read_excel('large_file.xlsx', nrows=1000)
    

まとめ

PythonでのExcelデータ検索は、使用するライブラリによって内部的な順序が異なりますが、基本的には行優先で処理されることが多いです。これはPythonの内部データ構造が行優先(Row-major)であることに関連しています。