【pandas】-1-读取数据
【pandas】-2-数据查询
【pandas】-3-Pandas 索引
【pandas】-4- 索新增列,assign,applay,map使用
【pandas】-5-缺失值处理
【pandas】-6-排序&去重
【pandas】-7-数据分组处理
【pandas】-8-数据变形/数据透视
2.Pandas数据查询
import pandas as pd
# 创建一个示例 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'部门': ['销售', '技术', '技术', '市场', '销售', None],
'年龄': [25, 32, 28, 45, 36, 80],
'工资': [50000, 85000, 72000, 60000, 48000, 8000],
'入职年份': [2019, 2016, 2018, 2010, 2020, 2021]
}
df = pd.DataFrame(data)
print(df)
2.1 布尔索引(最常用,最基础)
用法: df[条件]
# 筛选出所有“技术”部门的员工
condition = df['部门'] == '技术' # 这会得到一个布尔序列
tech_employees = df[condition]
# 更常见的写法是直接写在一起
tech_employees = df[df['部门'] == '技术']
print(tech_employees)
多条件组合:
使用 & (与), | (或), ~ (非) 来组合多个条件,每个条件必须用括号 () 括起来。
# 筛选出“技术”部门且“年龄大于30”的员工
tech_and_over_30 = df[(df['部门'] == '技术') & (df['年龄'] > 30)]
print(tech_and_over_30)
# 筛选出“技术”部门“或”“工资大于70000”的员工
tech_or_high_salary = df[(df['部门'] == '技术') | (df['工资'] > 70000)]
print(tech_or_high_salary)
# 筛选出“非销售”部门的员工
not_sales = df[~(df['部门'] == '销售')]
print(not_sales)
2.2 query() 方法
这种方法非常 简洁和直观,允许你使用字符串表达式进行查询,类似于 SQL 的 WHERE 子句。对于列名中有空格的情况尤其有用。
需要注意外层单引号,值双引号
# 等价于 df[(df['部门'] == '技术') & (df['年龄'] > 30)]
result = df.query('部门 == "技术" and 年龄 > 30')
print(result)
# 使用变量进行查询(注意用 @ 符号引用外部变量)
threshold = 60000
result = df.query('工资 > @threshold and 入职年份 > 2015')
print(result)
2.3 loc 和 iloc 索引器
这两个方法主要用于 通过标签或位置选择行和列,但也常用于查询。
loc[]: 基于 标签(index, column names) 进行选择。iloc[]: 基于 整数位置(0-indexed) 进行选择。
用法: df.loc[行条件, 列条件] 行 列 用 【逗号】 分割
# 使用 loc 进行布尔索引(最常用)
# 选择所有“销售”部门的行,并显示“姓名”和“工资”列
sales_info = df.loc[df['部门'] == '销售', ['姓名', '工资']]
print(sales_info)
# 使用 loc 按标签选择行
# 选择 index 为 1 和 2 的行,以及从‘姓名’到‘工资’的列
subset = df.loc[1:2, '姓名':'工资'] # 注意:loc的切片是包含末位的!
print(subset)
# 使用 iloc 按位置选择,行切片不包含末位
# 选择第2行(index=1)和第3行(index=2),第1列(index=0)和第3列(index=2)
# 语法:df.iloc[行位置, 列位置]
subset_by_position = df.iloc[1:3, [0, 2]] # 行切片不包含末位,与列表切片一致
print(subset_by_position)
2.4 isin() 方法
当你需要筛选某列的值 属于一个列表 中的任意一个时,这种方法非常高效。
用法: df[df[‘列名’].isin(列表)]
# 筛选出部门是“销售”或“市场”的员工
target_departments = ['销售', '市场']
result = df[df['部门'].isin(target_departments)]
print(result)
# 与 ~ 结合使用,筛选出“不属于”这些部门的员工
result = df[~df['部门'].isin(target_departments)]
print(result) # 输出:技术部的员工
2.5 字符串方法 (str.contains)
当需要基于文本内容进行 模糊匹配(如包含某个字符)时使用。
用法: df[df[‘列名’].str.contains(‘字符串’)]
# 筛选出姓名中包含“五”的员工
result = df[df['姓名'].str.contains('五')]
print(result)
# 通常搭配 na=False 处理NaN值,搭配 case=False 进行不区分大小写匹配
result = df[df['部门'].str.contains('技', na=False, case=False)]
print(result)
总结与选择建议
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 布尔索引 | 简单或复杂的条件组合 | 最基础灵活,万能方法 | 条件复杂时括号繁多,容易写错 |
query() | 多条件查询,代码可读性要求高 | 语法简洁,类似SQL,易读 | 不适用于非常复杂的逻辑 |
loc/iloc | 同时筛选行和列 | 功能强大,可精确定位行列 | 主要用于选择,条件查询是其应用之一 |
isin() | 匹配一个列表中的多个值 | 代码简洁,效率高 | 仅用于“属于”或“不属于”的场景 |
str.contains | 文本内容的模糊查询 | 处理文本查询的利器 | 只适用于字符串列 |
建议:
- 新手入门:先从 布尔索引 开始,这是所有方法的基础。
- 简单条件:直接用布尔索引
df[df[‘A’] > 10]。 - 多条件查询:优先考虑使用
query(),代码会更清晰。 - 选择特定行列:一定要用
loc/iloc。 - 检查是否在列表中:毫不犹豫地用
isin()。 - 处理文本模糊查找:记得用
str.contains()。

820

被折叠的 条评论
为什么被折叠?



