看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在业务分析中,经常需要衡量某个指标相对于“上一次”的变化,例如:
这种“分组下的环比计算”在 pandas 中可以优雅地通过三个方法组合实现:
groupby() —— 按人物/店铺/用户分类shift() —— 获取每个组的上一行数据pct_change() —— 计算百分比变化率通过本篇,你将学会如何计算“组内上次 vs 本次”的变化趋势,并掌握一个非常常用的分析套路。
我们有不同销售员的按日期记录的销售额。下面是示例数据(字符串形式读取):
import pandas as pd
from io import StringIO
data = StringIO("""
salesman,date,sales
Alice,2024-11-01,120
Alice,2024-11-03,180
Alice,2024-11-05,150
Bob,2024-11-02,200
Bob,2024-11-05,260
Bob,2024-11-07,300
Charlie,2024-11-01,100
Charlie,2024-11-04,120
Charlie,2024-11-10,180
""")
df = pd.read_csv(data, parse_dates=['date'])
我们需要:
思路如下:
salesman 和 date 排序,确保时间顺序正确。groupby('salesman')['sales'].shift() 获取每位销售员“上一笔销售额”。groupby().pct_change() 或 (sales - prev_sales) / prev_sales 计算百分比变化。代码如下:
result = (
df
.sort_values(['salesman', 'date'])
.assign(
prev_sales=lambda x: x.groupby('salesman')['sales'].shift(),
pct_change=lambda x: x.groupby('salesman')['sales'].pct_change()
)
)
print(result)
输出示例:
salesman date sales prev_sales pct_change
0 Alice 2024-11-01 120 NaN NaN
1 Alice 2024-11-03 180 120.0 0.500000
2 Alice 2024-11-05 150 180.0 -0.166667
3 Bob 2024-11-02 200 NaN NaN
4 Bob 2024-11-05 260 200.0 0.300000
5 Bob 2024-11-07 300 260.0 0.153846
6 Charlie 2024-11-01 100 NaN NaN
7 Charlie 2024-11-04 120 100.0 0.200000
8 Charlie 2024-11-10 180 120.0 0.500000
代码分析如下:
.sort_values(['salesman', 'date']) 保证每个销售员的数据按时间顺序排列,否则 shift() 取到的不是“上一笔”.groupby('salesman')['sales'].shift() 为每个销售员插入上一条销售额,用于之后的变化率计算。.pct_change() 自动计算百分比变化 (current - previous) / previous,并支持按组计算。.assign() 连续添加两个新列,让逻辑清晰、链式调用更加优雅。这种写法既简洁又专业,非常适合在实际业务分析中使用。
几乎所有“组内时间序列比较”都可以用这个模板解决。
(完)
更新时间:2025-11-14 10:29:13 标签:pandas python 分组 环比 增长分析