本文目录导读:

我来为你详细讲解如何使用Pandas进行数据筛选,包含多个实用的案例:
基础数据筛选方法
准备工作
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '孙七'],
'年龄': [25, 30, 35, 28, 32],
'城市': ['北京', '上海', '广州', '北京', '深圳'],
'工资': [15000, 20000, 18000, 12000, 25000],
'部门': ['技术部', '市场部', '技术部', '行政部', '技术部']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
1 单条件筛选
# 筛选年龄大于30的人
result1 = df[df['年龄'] > 30]
print("年龄大于30的人:")
print(result1)
# 筛选城市为北京的人
result2 = df[df['城市'] == '北京']
print("\n北京的人:")
print(result2)
# 筛选工资不等于15000的人
result3 = df[df['工资'] != 15000]
print("\n工资不等于15000的人:")
print(result3)
2 多条件筛选
# 使用 & (与) 组合条件
result4 = df[(df['年龄'] > 25) & (df['工资'] > 15000)]
print("年龄大于25且工资大于15000的人:")
print(result4)
# 使用 | (或) 组合条件
result5 = df[(df['城市'] == '北京') | (df['城市'] == '上海')]
print("\n北京或上海的人:")
print(result5)
# 使用 ~ (非) 取反
result6 = df[~(df['部门'] == '技术部')]
print("\n非技术部的人:")
print(result6)
高级筛选函数
1 query() 方法
# 使用query方法,语法更简洁
result7 = df.query('年龄 > 25 and 工资 > 15000')
print("使用query筛选:")
print(result7)
# 支持变量引用
min_age = 25
max_salary = 20000
result8 = df.query('年龄 > @min_age and 工资 < @max_salary')
print("\n使用变量进行筛选:")
print(result8)
2 isin() 方法
# 筛选多个值
cities = ['北京', '上海', '深圳']
result9 = df[df['城市'].isin(cities)]
print("筛选指定城市的人:")
print(result9)
# 排除多个值
exclude_cities = ['广州']
result10 = df[~df['城市'].isin(exclude_cities)]
print("\n排除广州的人:")
print(result10)
3 between() 方法
# 筛选年龄在25到32之间的人
result11 = df[df['年龄'].between(25, 32)]
print("年龄在25-32之间的人:")
print(result11)
# 筛选工资在10000到20000之间的人
result12 = df[df['工资'].between(10000, 20000, inclusive='both')]
print("\n工资在10000-20000之间的人:")
print(result12)
字符串筛选
# 创建含字符串的数据
data2 = {
'姓名': ['张三丰', '李思思', '王五', '赵灵儿', '孙悟'],
'邮箱': ['zhangsan@qq.com', 'lisi@163.com', 'wangwu@gmail.com', 'zhao@qq.com', 'sun@163.com']
}
df2 = pd.DataFrame(data2)
# 包含特定字符
result13 = df2[df2['姓名'].str.contains('三')]
print("姓名包含'三'的人:")
print(result13)
# 以特定字符开头
result14 = df2[df2['姓名'].str.startswith('张')]
print("\n姓张的人:")
print(result14)
# 以特定字符结尾
result15 = df2[df2['邮箱'].str.endswith('@qq.com')]
print("\nQQ邮箱用户:")
print(result15)
函数式筛选
1 apply() 自定义函数
# 自定义筛选函数
def salary_level(income):
return income >= 18000
result16 = df[df['工资'].apply(salary_level)]
print("高工资人群:")
print(result16)
# 多列条件自定义函数
def is_high_earner(row):
return row['工资'] > 15000 and row['年龄'] < 35
result17 = df[df.apply(is_high_earner, axis=1)]
print("\n年轻的高收入人群:")
print(result17)
2 lambda函数
# 使用lambda函数
result18 = df[df['工资'].apply(lambda x: x > 15000 and x < 25000)]
print("工资在15000-25000之间的人:")
print(result18)
# 多条件lambda
result19 = df[df.apply(lambda row: row['工资'] > 15000 and row['年龄'] > 25, axis=1)]
print("\n工资>15000且年龄>25的人:")
print(result19)
实战案例
案例1:数据清洗与筛选
# 创建含缺失值的数据
data3 = {
'姓名': ['张三', '李四', '王五', '赵六', '孙七'],
'年龄': [25, None, 35, 28, 32],
'城市': ['北京', '上海', None, '北京', '深圳'],
'工资': [15000, 20000, 18000, None, 25000]
}
df3 = pd.DataFrame(data3)
# 筛选非空值
result20 = df3[df3['年龄'].notna()]
print("年龄非空的数据:")
print(result20)
# 筛选多个非空列
result21 = df3[df3[['年龄', '工资']].notna().all(axis=1)]
print("\n年龄和工资都不为空的数据:")
print(result21)
案例2:复杂业务筛选
# 模拟销售数据
sales_data = {
'产品': ['A', 'B', 'C', 'D', 'E', 'F'],
'销量': [100, 250, 150, 300, 80, 200],
'价格': [50, 80, 65, 90, 45, 70],
'区域': ['华东', '华南', '华北', '华东', '华南', '华北'],
'日期': ['2024-01-15', '2024-02-20', '2024-03-10', '2024-01-25', '2024-02-15', '2024-03-20']
}
df_sales = pd.DataFrame(sales_data)
df_sales['日期'] = pd.to_datetime(df_sales['日期'])
# 复杂筛选:华东区域销量大于150的产品
result22 = df_sales[(df_sales['区域'] == '华东') & (df_sales['销量'] > 150)]
print("华东区域销量>150的产品:")
print(result22)
# 筛选:2024年1月之后销量前3的产品
result23 = df_sales[df_sales['日期'] > '2024-01-31'].nlargest(3, '销量')
print("\n2024年1月后销量前3的产品:")
print(result23)
性能优化建议
# 使用loc索引器(推荐)
result24 = df.loc[df['年龄'] > 25, ['姓名', '工资']]
print("使用loc筛选:")
print(result24)
# 链式筛选
result25 = df.loc[df['年龄'] > 25].loc[df['工资'] > 15000]
print("\n链式筛选:")
print(result25)
# 使用布尔索引数组(性能更好)
mask = (df['年龄'] > 25) & (df['工资'] > 15000)
result26 = df[mask]
print("\n使用布尔索引:")
print(result26)
Pandas数据筛选的核心方法:
- 布尔索引:
df[df['列名'] > 值] - query():
df.query('条件表达式') - isin():
df[df['列名'].isin([值1, 值2])] - between():
df[df['列名'].between(最小值, 最大值)] - str.contains():字符串匹配
- apply():自定义函数筛选
最佳实践:
- 使用
loc索引器而非链式索引 - 大数据集使用
query()方法 - 复杂条件使用布尔索引数组
- 注意处理缺失值对筛选结果的影响
这些方法可以组合使用,满足各种复杂的数据筛选需求。