本文目录导读:

我来为你详细讲解如何使用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()方法 - 复杂条件使用布尔索引数组
- 注意处理缺失值对筛选结果的影响
这些方法可以组合使用,满足各种复杂的数据筛选需求。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播