看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在处理具有固定类别的数据时,我们经常需要按照特定的顺序进行排序和筛选。pandas 的 Categorical 类型可以帮助我们定义自定义排序顺序,确保数据分析结果符合业务逻辑。本文将介绍如何使用 pd.Categorical 结合基本的数据操作,实现按自定义顺序的排序和筛选。
假设我们有一份简单的产品数据,包含产品名称、类别和价格。我们需要:
先创建示例数据:
import pandas as pd
from io import StringIO
data = """
product_name,category,price
iPhone,Electronics,999
T-Shirt,Clothing,29
Coffee,Food,5
Laptop,Electronics,1299
Jeans,Clothing,79
Banana,Food,1
Headphones,Electronics,199
"""
df = pd.read_csv(StringIO(data))
df
'''
product_name category price
0 iPhone Electronics 999
1 T-Shirt Clothing 29
2 Coffee Food 5
3 Laptop Electronics 1299
4 Jeans Clothing 79
5 Banana Food 1
6 Headphones Electronics 199
'''
期望的输出应该按自定义的类别顺序(Electronics → Clothing → Food)排列,每个类别内按价格降序排列,且只包含价格大于20的产品。
解决这个需求需要以下几个步骤:
代码如下:
# 定义类别的自定义顺序
category_order = ['Electronics', 'Clothing', 'Food']
# 使用链式方法进行处理
(
df
# 将category列转换为分类数据类型
.assign(
category=lambda x: pd.Categorical(
x['category'],
categories=category_order,
ordered=True
)
)
# 筛选价格大于20的产品
.query('price > 20')
# 按类别(自定义顺序)和价格(降序)排序
.sort_values(['category', 'price'], ascending=[True, False])
# 重置索引
.reset_index(drop=True)
)
'''
product_name category price
0 Laptop Electronics 1299
1 iPhone Electronics 999
2 Headphones Electronics 199
3 Jeans Clothing 79
4 T-Shirt Clothing 29
'''
代码分析:
assign()
结合 pd.Categorical()
将类别列转换为分类数据,指定自定义顺序和排序属性query()
进行简单的条件筛选,只保留价格大于20的产品sort_values()
进行多重排序,先按类别(遵循自定义顺序),再按价格降序排列reset_index(drop=True)
重置索引,使结果更整洁这种方法特别适合处理需要按照业务定义顺序展示的数据,比如产品分类、优先级排序等场景。pd.Categorical 确保了排序顺序的一致性,使分析结果更加符合业务需求。
(完)
更新时间:2025-09-10 21:54:26 标签:pandas python 分类数据 分组统计