讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

Python怎么用pandas筛选数据_Pandas数据筛选实用技巧

夜墨吖_2740

夜墨吖_2740

发布时间:2025-09-13 14:45:01

|

812人浏览过

|

来源于php中文网

原创

Pandas筛选数据核心是布尔索引,通过条件生成True/False序列来选择行;结合loc、iloc、query()、isin()、between()及.str方法可实现多条件组合与复杂场景筛选,处理缺失值可用isnull()/notna(),配合括号明确优先级,提升代码可读性与效率。

python怎么用pandas筛选数据_pandas数据筛选实用技巧

Pandas在Python里筛选数据,核心就是利用布尔索引(Boolean Indexing)。你给它一个条件,它会返回一个True/False的序列,然后Pandas就用这个序列来挑选出所有对应为True的行。此外,

loc
和
iloc
这两个强大的访问器,配合布尔索引能实现更精细的筛选。更高级点,
query()
方法提供了一种更接近SQL的筛选语法,对于复杂条件尤其方便。理解这些,基本上就能应对绝大多数数据筛选的场景了。

import pandas as pd
import numpy as np

# 假设我们有一个DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九'],
    '年龄': [25, 30, 22, 35, 28, 40, 32],
    '城市': ['北京', '上海', '广州', '北京', '深圳', '上海', '杭州'],
    '收入': [8000, 12000, 7000, 15000, 10000, 18000, 9500],
    '是否在职': [True, True, False, True, True, True, False]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
print("-" * 30)

# 1. 基本布尔索引筛选:筛选年龄大于30的人
filtered_df_age = df[df['年龄'] > 30]
print("筛选年龄大于30的人:")
print(filtered_df_age)
print("-" * 30)

# 2. 使用loc进行筛选:筛选城市是北京且收入高于10000的人
# loc的强大之处在于可以同时指定行和列的标签
filtered_df_loc = df.loc[(df['城市'] == '北京') & (df['收入'] > 10000)]
print("筛选城市是北京且收入高于10000的人 (使用loc):")
print(filtered_df_loc)
print("-" * 30)

# 3. 使用query()方法:筛选年龄在25到35之间,且不在职的人
# query方法用字符串表达式,有时候写起来更直观
filtered_df_query = df.query('25 <= 年龄 <= 35 and not 是否在职')
print("筛选年龄在25到35之间,且不在职的人 (使用query):")
print(filtered_df_query)
print("-" * 30)

# 4. 使用isin()方法:筛选城市是北京或上海的人
filtered_df_isin = df[df['城市'].isin(['北京', '上海'])]
print("筛选城市是北京或上海的人 (使用isin):")
print(filtered_df_isin)
print("-" * 30)

# 5. 字符串方法筛选:筛选姓名包含“三”或“七”的人
# 注意这里需要访问.str属性
filtered_df_str = df[df['姓名'].str.contains('三|七')]
print("筛选姓名包含“三”或“七”的人 (使用str.contains):")
print(filtered_df_str)
print("-" * 30)

# 6. 筛选缺失值:如果DataFrame中有缺失值
df_with_nan = df.copy()
df_with_nan.loc[0, '收入'] = np.nan
df_with_nan.loc[2, '城市'] = np.nan
print("包含缺失值的DataFrame:")
print(df_with_nan)
print("-" * 30)

# 筛选收入不为空的行
filtered_not_null = df_with_nan[df_with_nan['收入'].notna()]
print("筛选收入不为空的行:")
print(filtered_not_null)
print("-" * 30)

# 筛选城市为空的行
filtered_null_city = df_with_nan[df_with_nan['城市'].isnull()]
print("筛选城市为空的行:")
print(filtered_null_city)
print("-" * 30)

如何用多条件组合筛选数据?

在实际的数据分析中,我们很少只用一个条件来筛选数据。通常都需要结合多个条件,比如“年龄大于30且城市是上海”或者“收入低于8000或不在职”。Pandas在这方面做得非常灵活,主要依赖于布尔运算符

&
(and),
|
(or),
~
(not)。我个人在写多条件筛选时,习惯性地会把每个条件用括号括起来,这样不仅能明确运算的优先级,也能让代码看起来更清晰,减少出错的可能。毕竟,Python的运算符优先级有时候挺微妙的,不加括号可能就不是你想要的结果了。

举个例子,我们想找出那些“年龄大于30”并且“收入高于15000”的人。

立即学习“Python免费学习笔记(深入)”;

# 筛选年龄大于30 并且 收入高于15000的人
filtered_and = df[(df['年龄'] > 30) & (df['收入'] > 15000)]
print("年龄大于30 并且 收入高于15000的人:")
print(filtered_and)
print("-" * 30)

# 如果我们想找“城市是北京”或者“是否在职为False”的人
filtered_or = df[(df['城市'] == '北京') | (df['是否在职'] == False)]
print("城市是北京 或者 是否在职为False 的人:")
print(filtered_or)
print("-" * 30)

# 组合“非”操作:筛选不是北京人,且年龄小于30的人
filtered_not_and = df[(~(df['城市'] == '北京')) & (df['年龄'] < 30)]
print("不是北京人,且年龄小于30的人:")
print(filtered_not_and)
print("-" * 30)

这里有个小细节,如果你不加括号,像

df['年龄'] > 30 & df['收入'] > 15000
这样写,Python会先计算
30 & df['收入']
,这显然不是我们想要的布尔运算。所以,养成给每个条件加括号的好习惯,能省去不少调试时间。

除了布尔索引,还有哪些高效的筛选方法?

Biopython
Biopython

全面的分子生物学工具集。适用于序列操作、文件解析(FASTA/GenBank/PDB)、系统发育分析,以及通过 Bio.Entrez 以编程方式访问 NCBI/

下载

布尔索引确实是基石,但Pandas还提供了不少“语法糖”或者说更“高阶”的筛选方法,它们在特定场景下能让代码更简洁、更具可读性。我个人觉得,这些方法并不是要取代布尔索引,而是作为它的补充,或者说,是布尔索引在特定模式下的优化封装。

  1. query()
    方法: 这个方法我有时候会偷懒用,特别是条件比较多、比较复杂的时候。它允许你用字符串的形式表达筛选条件,非常类似于SQL的
    WHERE
    子句。对于熟悉SQL的人来说,上手会很快。它内部会进行一些优化,在处理大型数据集时可能比直接的布尔索引效率更高,因为它避免了创建大量的中间布尔Series。

    # 筛选年龄大于25,收入小于12000,且城市不是上海的人
    filtered_query_complex = df.query('年龄 > 25 and 收入 < 12000 and 城市 != "上海"')
    print("使用query()筛选:年龄大于25,收入小于12000,且城市不是上海的人:")
    print(filtered_query_complex)
    print("-" * 30)
    
    # query()方法也支持引用外部变量,前面加一个'@'符号
    min_age = 28
    target_city = '北京'
    filtered_query_var = df.query('年龄 >= @min_age and 城市 == @target_city')
    print(f"使用query()和外部变量筛选:年龄大于等于{min_age},且城市是{target_city}的人:")
    print(filtered_query_var)
    print("-" * 30)

    query()
    的缺点是,如果你条件非常简单,写成字符串反而显得有点重,而且调试字符串表达式有时候不如直接的Python表达式直观。但对于复杂条件,它确实能让代码更像“人话”。

  2. isin()
    方法: 当你想筛选某一列的值是否在给定的一组值中时,
    isin()
    方法简直是神器。它比写一堆
    or
    条件要优雅得多。

    # 筛选城市是北京、上海或深圳的人
    target_cities = ['北京', '上海', '深圳']
    filtered_isin_list = df[df['城市'].isin(target_cities)]
    print(f"使用isin()筛选:城市在{target_cities}中的人:")
    print(filtered_isin_list)
    print("-" * 30)
  3. between()
    方法: 对于数值型数据,如果你想筛选一个范围内的值,
    between()
    方法非常方便,它默认是包含边界的(inclusive)。

    # 筛选收入在8000到12000之间的人 (包含8000和12000)
    filtered_between_income = df[df['收入'].between(8000, 12000)]
    print("使用between()筛选:收入在8000到12000之间的人:")
    print(filtered_between_income)
    print("-" * 30)
  4. 字符串方法 (

    .str
    accessor): 当你的列是字符串类型时,Pandas提供了
    .str
    访问器,里面封装了很多字符串操作方法,比如
    contains()
    、
    startswith()
    、
    endswith()
    、
    match()
    等,它们都能直接用于筛选。

    # 筛选姓名以“张”开头的人
    filtered_str_start = df[df['姓名'].str.startswith('张')]
    print("使用str.startswith()筛选:姓名以“张”开头的人:")
    print(filtered_str_start)
    print("-" * 30)
    
    # 筛选城市名称中包含“京”字的行
    filtered_str_contains = df[df['城市'].str.contains('京')]
    print("使用str.contains()筛选:城市名称中包含“京”字的行:")
    print(filtered_str_contains)
    print("-" * 30)

    这些方法在处理文本数据时,真的能让代码变得非常简洁和高效。

处理缺失值或特定类型数据时,筛选有什么技巧?

处理缺失值(NaN, Not a Number)是数据清洗的常见环节,筛选出或排除缺失值也是一种重要的筛选操作。Pandas为此提供了非常直观的方法:

isnull()
和
notnull()
(或者它们的别名
isna()
和
notna()
)。

  1. 筛选缺失值 (

    isnull()
    /
    isna()
    ):
    如果你想找出某一列中所有值为缺失值的行,就用这个。这对于理解数据质量,或者专门处理那些不完整的数据非常有用。

    # 假设我们有一个DataFrame,其中包含一些缺失值
    df_with_missing = df.copy()
    df_with_missing.loc[1, '年龄'] = np.nan
    df_with_missing.loc[4, '收入'] = np.nan
    df_with_missing.loc[6, '城市'] = np.nan
    print("包含缺失值的DataFrame:")
    print(df_with_missing)
    print("-" * 30)
    
    # 筛选年龄列中存在缺失值的行
    missing_age_rows = df_with_missing[df_with_missing['年龄'].isnull()]
    print("筛选年龄列中存在缺失值的行:")
    print(missing_age_rows)
    print("-" * 30)
    
    # 筛选收入列中存在缺失值的行
    missing_income_rows = df_with_missing[df_with_missing['收入'].isna()]
    print("筛选收入列中存在缺失值的行 (使用isna()):")
    print(missing_income_rows)
    print("-" * 30)
  2. 筛选非缺失值 (

    notnull()
    /
    notna()
    ):
    与
    isnull()
    相反,
    notnull()
    用于筛选出某一列中所有非缺失值的行。这在很多情况下更常用,因为我们通常希望处理完整的数据。

    # 筛选收入列中没有缺失值的行
    non_missing_income_rows = df_with_missing[df_with_missing['收入'].notnull()]
    print("筛选收入列中没有缺失值的行:")
    print(non_missing_income_rows)
    print("-" * 30)
    
    # 筛选城市列中没有缺失值的行
    non_missing_city_rows = df_with_missing[df_with_missing['城市'].notna()]
    print("筛选城市列中没有缺失值的行 (使用notna()):")
    print(non_missing_city_rows)
    print("-" * 30)
  3. 结合多列缺失值筛选: 我们也可以结合多个条件来筛选,比如筛选所有至少有一列缺失值的行,或者所有特定几列都非缺失值的行。

    # 筛选任何一列存在缺失值的行 (axis=1表示在行方向上检查)
    rows_with_any_nan = df_with_missing[df_with_missing.isnull().any(axis=1)]
    print("筛选任何一列存在缺失值的行:")
    print(rows_with_any_nan)
    print("-" * 30)
    
    # 筛选所有列都非缺失值的行 (即删除所有包含缺失值的行)
    rows_with_no_nan = df_with_missing[df_with_missing.notnull().all(axis=1)]
    # 这其实和 df_with_missing.dropna() 的效果类似,但这里是筛选,dropna是直接删除
    print("筛选所有列都非缺失值的行:")
    print(rows_with_no_nan)
    print("-" * 30)

至于“特定类型数据”的筛选,这通常不是直接筛选数据内容,而是筛选DataFrame的列。比如,我们可能想找出所有数值型的列,或者所有对象(字符串)类型的列。这通常通过

select_dtypes()
方法来完成,而不是直接的行筛选。但如果你想筛选出某一列中数据类型“不符合预期”的行,那可能需要结合
apply()
和
type()
函数,或者在数据加载阶段就做好类型转换。例如,筛选出“年龄”列中不是整数的行,这在数据清洗中偶尔会遇到。

# 假设年龄列里不小心混入了一个字符串
df_mixed_type = df.copy()
df_mixed_type.loc[0, '年龄'] = '二十五'
print("包含混合类型数据的DataFrame:")
print(df_mixed_type)
print("-" * 30)

# 筛选年龄列中不是数值类型的行
# 这里需要用apply和type()来检查每个元素
non_numeric_age_rows = df_mixed_type[df_mixed_type['年龄'].apply(lambda x: not isinstance(x, (int, float)))]
print("筛选年龄列中不是数值类型的行:")
print(non_numeric_age_rows)
print("-" * 30)

这种对数据类型进行筛选的场景,虽然不那么常见,但在数据质量检查时确实能派上用场。总的来说,Pandas的筛选功能非常强大和灵活,只要掌握了布尔索引的原理,再结合各种辅助方法,就能游刃有余地处理各种数据筛选需求了。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

5003

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1011

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1309

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

7061

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3723

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

7040

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9861

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1330

2024.04.29

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn