Python案例如何用Pandas做数据分组周期

wen python案例 2

Python案例:如何用Pandas做数据分组周期(从入门到实战)

目录导读

  1. 数据分组与周期的核心概念

    Python案例如何用Pandas做数据分组周期

    • 什么是数据分组?什么是周期分析?
    • 为什么Pandas是处理分组周期的最佳工具?
  2. 准备工作:环境与数据

    • 安装Pandas与数据导入
    • 案例数据展示(销售订单数据)
  3. 基础操作:groupby与周期聚合

    • 按客户ID分组,计算月均消费
    • 按季度分组,统计销售总额
  4. 进阶技巧:多级分组与滚动周期

    • 按“地区+产品类别”分组,分析年度趋势
    • 使用rolling()实现7天滑动周期分析
  5. 实战案例:电商用户生命周期分组

    • 生成用户首次购买日期(cohort)
    • 按月分组计算留存率
  6. 常见问题与解答

    • Q1:分组后周期索引如何对齐?
    • Q2:大内存数据分组性能优化技巧?
  7. 总结与最佳实践


数据分组与周期的核心概念

在数据分析中,“分组”是指根据某个或多个字段将数据拆分成子集,“周期”则强调时间维度的规律性(如日、周、月、季度),当这两者结合时,就能回答类似“每个客户每个月的平均消费是多少”或者“不同产品类别在Q3的销量走势如何”这类业务问题。

Pandas之所以成为数据科学家首选,因为它提供了链式操作(如 df.groupby().resample())和灵活的窗口函数(如 rolling()expanding()),无需写复杂循环即可完成分组周期分析。

注意:如果你遇到域名相关的资源,请将 www.example.com 替换为你的本地文档路径 ./docs/pandas_guide


准备工作:环境与数据

首先安装 Pandas(如果还未安装):

pip install pandas numpy matplotlib

然后导入库并创建示例数据——模拟一家电商公司2023年的销售记录:

import pandas as pd
import numpy as np
# 生成日期范围
date_rng = pd.date_range(start='2023-01-01', end='2023-12-31', freq='H')
df = pd.DataFrame(date_rng, columns=['order_date'])
# 随机生成客户、产品、金额等字段
df['customer_id'] = np.random.choice(['A','B','C','D'], size=len(df))
df['product_category'] = np.random.choice(['电子产品','服装','食品'], size=len(df))
df['region'] = np.random.choice(['华北','华东','华南'], size=len(df))
df['amount'] = np.random.randint(10, 500, size=len(df))
# 查看前5行
print(df.head())

基础操作:groupby与周期聚合

1 按客户ID分组,计算月均消费

如果我们想了解每个客户每个月的平均消费金额:

# 先提取月份
df['month'] = df['order_date'].dt.to_period('M')
# 分组聚合
monthly_avg = df.groupby(['customer_id', 'month'])['amount'].mean()
print(monthly_avg.head())

输出示例:

customer_id  month  
A            2023-01    254.78
             2023-02    301.45
             2023-03    189.22
...

关键点:使用 dt.to_period('M') 将日期转换为周期型,分组更高效。

2 按季度分组,统计销售总额

若要分析整个平台2023年各季度的业绩:

df['quarter'] = df['order_date'].dt.quarter
quarterly_sum = df.groupby('quarter')['amount'].sum()
print(quarterly_sum)

结果将显示Q1~Q4的总金额,若要同时保留年份,可用 dt.to_period('Q')


进阶技巧:多级分组与滚动周期

1 按“地区+产品类别”分组,分析年度趋势

使用 groupby 多级索引,再配合 resample 重采样:

# 设置日期为索引,按周重采样
df_time = df.set_index('order_date')
weekly_sales = df_time.groupby(['region', 'product_category'])['amount'].resample('W').sum()
print(weekly_sales.head())

resample('W') 自动按周分组,对每个组合计算每周销量。

2 使用rolling()实现7天滑动周期分析

滑动窗口可以平滑短期波动,例如计算每个客户过去7天的累计消费:

df_customer_A = df[df['customer_id']=='A'].set_index('order_date')
df_customer_A['rolling_7d_sum'] = df_customer_A['amount'].rolling('7D').sum()
print(df_customer_A[['amount', 'rolling_7d_sum']].head(10))

注意:rolling('7D') 要求索引为 DatetimeIndex 且有序,如果数据稀疏,会基于实际时间点计算窗口。


实战案例:电商用户生命周期分组

背景:我们需要分析不同月份新注册用户在后续月份的留存情况(Cohort分析)。

步骤1:生成每个用户的首次购买日期

first_order = df.groupby('customer_id')['order_date'].min().reset_index()
first_order.columns = ['customer_id', 'first_order_date']
df = df.merge(first_order, on='customer_id', how='left')

步骤2:创建月份偏移字段

df['order_month'] = df['order_date'].dt.to_period('M')
df['first_month'] = df['first_order_date'].dt.to_period('M')
df['month_offset'] = (df['order_month'] - df['first_month']).apply(lambda x: x.n)  # 整数偏移量

步骤3:按月分组并计算留存用户数

cohort_data = df.groupby(['first_month', 'month_offset'])['customer_id'].nunique().reset_index()
# 透视表格
cohort_pivot = cohort_data.pivot_table(index='first_month', columns='month_offset', values='customer_id')
print(cohort_pivot.head())

该表格的行是用户首次购买月份,列是后续第N个月,值为活跃用户数,除以首月用户数即可得留存率。


常见问题与解答

Q1:分组后周期索引如何对齐?

假设我们想按小时分组计算均值,但有些时间段无数据,可以使用 reindex 补全缺失时间点:

hourly = df.groupby(df['order_date'].dt.floor('H'))['amount'].mean()
full_hours = pd.date_range('2023-01-01', '2023-01-02', freq='H')
hourly_filled = hourly.reindex(full_hours, fill_value=0)

Q2:大内存数据分组性能优化技巧?

  • groupby 前对分类字段使用 pd.Categorical 类型,减少内存占用。
  • 使用 as_index=False 避免创建多重索引,加速聚合。
  • 若数据过大,考虑用 dask.dataframe 进行分布式分组。
df['customer_id'] = df['customer_id'].astype('category')  # 内存优化
result = df.groupby('customer_id', as_index=False)['amount'].sum()

总结与最佳实践

通过本文的Python案例,我们掌握了Pandas处理数据分组周期的四种核心模式:

模式 方法 适用场景
基础分组+周期字段 groupby(cust, month) 计算每个实体的周期均值
多级分组+重采样 groupby(region, prod).resample('W') 多维度的周期趋势
滚动周期 rolling('7D').sum() 平滑短期波动
生命周期Cohort 偏移量+透视表 用户留存分析

最佳实践

  • 始终将日期列转为 datetime64 类型。
  • 使用 dt.to_period() 而非字符串切割,保留周期语义。
  • 组合 groupbyresample 时注意索引顺序。

希望这些案例能帮你快速上手Pandas的分组周期分析,如果你有更复杂的场景,欢迎在实际项目中实践上述代码。

抱歉,评论功能暂时关闭!