【pandas】-2-数据查询

【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 lociloc 索引器

这两个方法主要用于 通过标签或位置选择行和列,但也常用于查询。

  • 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值