看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在实际数据处理工作中,我们经常需要根据多个条件筛选数据并进行分组统计。这类操作在业务分析、报表生成等场景中极为常见。本文将介绍如何使用 pandas 的链式方法,结合 query()、groupby() 和 agg() 等函数,高效完成复杂的数据处理任务。通过学习本案例,您将掌握 pandas 中多条件筛选、分组聚合以及结果美化的实用技巧。
假设我们有一份销售数据,包含日期、产品类别、销售区域和销售额信息。我们需要分析特定时间段内各类产品在不同区域的销售表现。
以下是模拟数据:
import pandas as pd
from io import StringIO
data = """
日期,类别,区域,销售额
2023-01-15,电子产品,华东,15000
2023-01-22,服装,华南,8000
2023-02-05,家居,华北,12000
2023-02-18,电子产品,华南,18000
2023-02-25,服装,华东,9500
2023-03-08,家居,华南,11000
2023-03-15,电子产品,华北,22000
2023-03-22,服装,华北,7500
2023-04-05,家居,华东,14000
2023-04-12,电子产品,华南,19000
2023-04-18,服装,华南,8500
2023-04-25,家居,华北,13000
2023-05-08,电子产品,华东,16000
2023-05-15,服装,华南,8200
2023-05-22,家居,华北,12500
2023-05-30,电子产品,华南,19500
"""
df = pd.read_csv(StringIO(data), parse_dates=['日期'])
需求:分析2023年第一季度(1-3月)各类产品在不同区域的销售情况,要求:
期望结果应该是一个包含上述信息的数据框,且按照总销售额从高到低排列。
解决这个需求可以分解为以下几个步骤:
我们将使用链式方法一次性完成所有这些操作,使代码简洁易读。
(
pd.read_csv(StringIO(data), parse_dates=['日期'])
.query('日期.dt.month in [1, 2, 3]') # 筛选第一季度数据
.groupby(['类别', '区域']) # 按类别和区域分组
# 计算总销售额和平均销售额
.agg(总销售额=('销售额', 'sum'), 平均销售额=('销售额', 'mean'))
.sort_values('总销售额', ascending=False) # 按总销售额降序排列
.reset_index() # 重置索引
.round({'平均销售额': 2}) # 平均销售额保留两位小数
)
'''
类别 区域 总销售额 平均销售额
0 电子产品 华北 22000 22000.0
1 电子产品 华南 18000 18000.0
2 电子产品 华东 15000 15000.0
3 家居 华北 12000 12000.0
4 家居 华南 11000 11000.0
5 服装 华东 9500 9500.0
6 服装 华南 8000 8000.0
7 服装 华北 7500 7500.0
'''
代码解析:
pd.read_csv(StringIO(data), parse_dates=['日期'])
读取数据并解析日期列query('日期.dt.month in [1, 2, 3]')
筛选出第一季度(1-3月)的数据groupby(['类别', '区域'])
按产品类别和区域进行分组agg(总销售额=('销售额', 'sum'), 平均销售额=('销售额', 'mean'))
聚合计算总销售额和平均销售额,并直接命名结果列sort_values('总销售额', ascending=False)
按总销售额降序排列reset_index()
将分组索引转换为普通列round({'平均销售额': 2})
将平均销售额四舍五入保留两位小数这种方法通过链式调用一次性完成了所有操作,代码简洁且易于理解,避免了创建中间变量的需要。
(完)
更新时间:2025-09-16 10:42:19 标签:pandas python 筛选 分组聚合分析