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)
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 JaneiroDataFrame の列で値を検索する
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()などを用いた文字列検索- 欠損値の検出・フィルタリング
- 複数列にまたがる条件指定
これらを組み合わせることで、必要なデータを素早く、正確かつきれいに抽出できます。
リンク
- How to Convert a Pandas DataFrame to a Python List
- How to Sort a Pandas DataFrame by Index
- How to Convert a Pandas Series to a DataFrame
- How to Create a List of Column Names in PySpark Dataframe
- How to Append a Pandas DataFrame in Python
- How to Rename a Column in Pandas DataFrame
よくある質問
-
DataFrame の列から特定の値を検索するにはどうすればいいですか?
ブールインデックスを使います:df[df['Age'] == 27] -
列から特定の値(1 つの要素)を取得するには?
行インデックスと列名を組み合わせて使います:df['Age'][0] -
単一の値を高速に取り出すには?
.atまたは.iatを使います:df.at[0, 'Age'] df.iat[0, 1]
;
