Skip to content

如何在 Pandas DataFrame 的列中轻松搜索值

Updated on

在 Pandas DataFrame 的列中搜索值,是数据筛选、清洗和分析中最基础的操作之一。Pandas 提供了多种强大的搜索方式——包括布尔索引、isin()query() 以及字符串操作——让这件事变得快捷又直观。

本文是更新版指南,覆盖了搜索 DataFrame 中值时最常用、也最现代的技巧,并配有可以直接应用到真实工作流中的示例。

想从 Pandas DataFrame 快速生成「零代码」数据可视化?
PyGWalker 可以在 Jupyter Notebook 中把你的 DataFrame 变成交互式、类似 Tableau 的界面。
PyGWalker on GitHub (opens in a new tab)

PyGWalker for Data visualization (opens in a new tab)


Pandas DataFrame 基础

Pandas DataFrame 是一个带有行、列标签的二维表格结构。下面是一个简单示例:

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)

输出:

     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)

输出:

   Name  Age Gender      City
0  John   27   Male  New York

你可以使用任意比较运算符:

运算符含义
==等于
!=不等于
> / <大于 / 小于
>= / <=大于等于 / 小于等于

示例:查找 Age ≥ 25 的行

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

2. 使用 isin() 搜索多个值

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

输出:

    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() 处理多个备选值
  • 使用 query() 进行类似 SQL 的易读过滤
  • 使用 str.contains() 进行字符串搜索
  • 按缺失值 / 非缺失值进行筛选
  • 多列联合过滤

掌握这些方法,可以帮助你快速、准确、干净地抽取所需数据。


链接


常见问题

  1. 如何在 DataFrame 的某一列中搜索某个具体值?
    使用布尔索引:

    df[df['Age'] == 27]
  2. 如何从一列中取出某个具体值?
    使用行索引 + 列名:

    df['Age'][0]
  3. 如何更快地获取单个值?
    使用 .at.iat

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

;