如何在 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)
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()进行字符串搜索 - 按缺失值 / 非缺失值进行筛选
- 多列联合过滤
掌握这些方法,可以帮助你快速、准确、干净地抽取所需数据。
链接
- 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] -
如何从一列中取出某个具体值?
使用行索引 + 列名:df['Age'][0] -
如何更快地获取单个值?
使用.at或.iat:df.at[0, 'Age'] df.iat[0, 1]
;
