看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在日常数据处理中,我们经常需要根据多个条件对数据进行筛选、分类和聚合分析。这类需求在业务分析、报表制作等场景中尤为常见。本文将介绍如何使用 pandas 的链式方法,结合条件判断和分组聚合操作,高效解决复杂的数据处理需求。通过学习本文,您将掌握 pandas 的 query、assign、groupby 和 agg 等方法的综合应用。
假设我们有一份销售数据,包含产品类别、销售额、成本和地区等信息。我们需要分析不同类别产品在各地区的盈利情况,并找出每个地区销售额高且盈利的产品。
数据以字符串形式提供如下:
import pandas as pd
from io import StringIO
data = """
product_id,category,sales,cost,region
1,A,2500,1800,North
2,B,4200,3000,South
3,A,3800,2500,North
4,C,5100,4000,East
5,B,2900,2200,South
6,A,4400,3200,West
7,C,3700,2800,East
8,B,5600,4500,North
9,A,3100,2400,South
10,C,4800,3600,West
"""
df = pd.read_csv(StringIO(data))
需求:
最终结果应该是一个DataFrame,包含每个地区平均利润最高的产品类别及其平均销售额和平均利润。
针对这个需求,我们可以按以下步骤解决:
import pandas as pd
from io import StringIO
# 数据读取
data = """
product_id,category,sales,cost,region
1,A,2500,1800,North
2,B,4200,3000,South
3,A,3800,2500,North
4,C,5100,4000,East
5,B,2900,2200,South
6,A,4400,3200,West
7,C,3700,2800,East
8,B,5600,4500,North
9,A,3100,2400,South
10,C,4800,3600,West
"""
import pandas as pd
from io import StringIO
# 数据读取
data = """
product_id,category,sales,cost,region
1,A,2500,1800,North
2,B,4200,3000,South
3,A,3800,2500,North
4,C,5100,4000,East
5,B,2900,2200,South
6,A,4400,3200,West
7,C,3700,2800,East
8,B,5600,4500,North
9,A,3100,2400,South
10,C,4800,3600,West
"""
(pd.read_csv(StringIO(data))
# 计算利润和利润率
.assign(profit=lambda x: x['sales'] - x['cost'],
profit_ratio=lambda x: (x['sales'] - x['cost']) / x['sales'])
# 筛选利润率高于15%的产品
.query('profit_ratio > 0.15')
# 按地区和产品类别分组
.groupby(['region', 'category'])
# 计算平均销售额和平均利润
.agg(avg_sales=('sales', 'mean'),
avg_profit=('profit', 'mean'))
# 重置索引以便后续操作
.reset_index()
# 按地区分组并找出每个地区平均利润最高的产品类别
.sort_values('avg_profit', ascending=False)
.groupby('region')
.head(1)
# 按地区排序使结果更加整洁
.sort_values('region')
)
代码分析:
这段代码展示了pandas链式方法的强大之处,通过一系列流畅的方法调用,我们能够高效地完成复杂的数据处理任务,同时保持代码的简洁性和可读性。
(完)
更新时间:2025-09-21 10:38:40 标签:pandas python 聚合分析 条件判断