Skip to content

Pandas DataFrame の列で値をかんたんに検索する方法

Updated on

Pandas DataFrame の列から値を検索する操作は、データのフィルタリング、クレンジング、分析のための基本です。Pandas には、ブールインデックス、isin(), query(), 文字列操作など、多くの強力な検索方法があり、この作業を高速かつ直感的に行えます。

このアップデートされたガイドでは、実務でそのまま使える例とともに、DataFrame で値を検索する際のもっとも有用でモダンなテクニックをまとめて解説します。

コードを書かずに Pandas DataFrame から素早く可視化を作りたいですか?
PyGWalker を使えば、Jupyter Notebook 上で DataFrame を Tableau ライクなインタラクティブ UI に変換できます。
PyGWalker on GitHub (opens in a new tab)

PyGWalker for Data visualization (opens in a new tab)


Pandas DataFrame の基本

Pandas DataFrame は、行と列にラベルを持つ 2 次元の表形式データ構造です。シンプルな例は次のとおりです:

import pandas as pd
 
data = {
    'Name': ['John', 'Emma', 'Peter', 'David', 'Sophie'],
    'Age': [27, 21, 24, 30, 29],
    'Gender': ['Male', 'Female', 'Male', 'Male', 'Female'],
    'City': ['New York', 'London', 'Paris', 'Tokyo', 'Rio de Janeiro']
}
 
df = pd.DataFrame(data)
print(df)

Output:

     Name  Age  Gender             City
0    John   27    Male         New York
1    Emma   21  Female           London
2   Peter   24    Male            Paris
3   David   30    Male            Tokyo
4  Sophie   29  Female  Rio de Janeiro

DataFrame の列で値を検索する

1. 完全一致を検索する(ブールインデックス)

result = df[df['Age'] == 27]
print(result)

Output:

   Name  Age Gender      City
0  John   27   Male  New York

任意の比較演算子を使うことができます:

Operator意味
==等しい
!=等しくない
> / <より大きい / より小さい
>= / <=以上 / 以下

例: Age が 25 以上の行を探す

df[df['Age'] >= 25]

2. isin() で複数の値を検索する

cities = ['Paris', 'Tokyo']
df[df['City'].isin(cities)]

Output:

    Name  Age Gender   City
2  Peter   24   Male  Paris
3  David   30   Male  Tokyo

値を除外したい場合は ~df['col'].isin() を使います。


3. 読みやすく高速な query() を使う

query() を使うと、SQL ライクな構文で行をフィルタリングできます。可読性に優れています。

df.query("Age == 27")

複数条件の指定も可能です:

df.query("Age > 25 and Gender == 'Female'")

ネストしたブールインデックスよりも、コードがすっきりすることが多いです。


4. 文字列パターンを検索する(str.contains()

テキスト列のフィルタリングに便利です。

部分文字列を含むかどうか

df[df['City'].str.contains('on', case=False, na=False)]

特定の文字で始まる / 終わる

df[df['Name'].str.startswith('J')]
df[df['City'].str.endswith('o')]

5. 欠損値 / 非欠損値を検索する

df[df['City'].isna()]      # 欠損
df[df['City'].notna()]     # 非欠損

6. 複数列にまたがって検索する

どれかの列が特定の値に一致する行を探す:

df[df.eq('Male').any(axis=1)]

すべての条件を満たす行を探す:

df[(df['Gender'] == 'Female') & (df['Age'] > 25)]

実践的で正確なパフォーマンス向上のコツ

以前のチュートリアルでは、一部のパフォーマンスに関する説明が誤解を招くものでした。ここでは正確な指針を示します。

✔ 1. 値の重複が多い列は category 型に変換する

比較処理を高速化できます:

df['City'] = df['City'].astype('category')

✔ 2. 非常に大きなデータセットでは NumPy 配列を使う

import numpy as np
 
ages = df['Age'].to_numpy()
df[ages == 27]

✔ 3. 検索には apply() を使わない

ブールインデックス、isin(), query() などのベクトル化された操作の方が常に高速です。

❌ 削除: 「.loc[] はブールインデックスより高速」

これは誤りです。内部的には同じように動作します。
.loc[] はラベルベースの選択のためのもので、速度向上のための機能ではありません。

searchsorted() について

searchsorted() は列がソートされている場合にのみ正しく動作し、値が本当に存在するかは確認しません

たとえば:

df_sorted = df.sort_values('Age')
idx = df_sorted['Age'].searchsorted(27)

これは挿入位置を返すだけであり、Age = 27 の行そのものとは限りません。

高度なワークフローでのみ使用してください。


まとめ

Pandas の列で値を検索することは、データ探索やクレンジングの基本です。Pandas には効率的な検索手段が多数用意されています:

  • 完全一致に対するブールインデックス
  • 複数の値を対象とする isin()
  • SQL ライクなクリーンなフィルタリングを行う query()
  • str.contains() などを用いた文字列検索
  • 欠損値の検出・フィルタリング
  • 複数列にまたがる条件指定

これらを組み合わせることで、必要なデータを素早く、正確かつきれいに抽出できます。


リンク


よくある質問

  1. DataFrame の列から特定の値を検索するにはどうすればいいですか?
    ブールインデックスを使います:

    df[df['Age'] == 27]
  2. 列から特定の値(1 つの要素)を取得するには?
    行インデックスと列名を組み合わせて使います:

    df['Age'][0]
  3. 単一の値を高速に取り出すには?
    .at または .iat を使います:

    df.at[0, 'Age']
    df.iat[0, 1]

;