news 2026/4/30 0:11:30

用Pandas groupby处理销售数据:从月度报表到用户分群的实际代码演练

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Pandas groupby处理销售数据:从月度报表到用户分群的实际代码演练

用Pandas groupby处理销售数据:从月度报表到用户分群的实际代码演练

电商平台每天产生海量交易数据,如何从中提炼商业价值?上周我接手一个紧急项目:分析某母婴品牌季度销售表现。原始数据包含37万条订单记录,需要快速生成分月、分用户、分品类的多维报告。传统Excel处理卡死多次,最终用Pandas的groupby功能在20分钟内完成全部分析。本文将还原这个实战过程,手把手教你用groupby解决真实商业问题。

1. 构建电商销售分析数据集

我们先模拟一个接近真实业务场景的数据集。假设某电商平台销售数据包含以下字段:

import pandas as pd import numpy as np from datetime import datetime np.random.seed(42) dates = pd.date_range('2023-01-01', '2023-06-30') user_ids = [f'UID{str(i).zfill(5)}' for i in range(1, 501)] categories = ['奶粉', '辅食', '纸尿裤', '洗护', '玩具'] data = { 'order_id': [f'ORD{str(i).zfill(6)}' for i in range(1, 10001)], 'user_id': np.random.choice(user_ids, 10000), 'order_date': np.random.choice(dates, 10000), 'amount': np.round(np.random.lognormal(mean=3, sigma=0.5, size=10000), 2), 'category': np.random.choice(categories, 10000, p=[0.3, 0.2, 0.25, 0.15, 0.1]) } df = pd.DataFrame(data) print(df.sample(5))

输出示例:

order_id user_id order_date amount category 5678 ORD005679 UID003 2023-04-12 148.23 奶粉 2345 ORD002346 UID127 2023-02-28 89.50 玩具 7890 ORD007891 UID042 2023-05-15 203.41 纸尿裤 1234 ORD001235 UID489 2023-01-23 56.78 辅食 8765 ORD008766 UID256 2023-06-18 112.90 洗护

这个数据集模拟了真实业务场景的三大特征:

  • 时间跨度:2023年上半年订单
  • 用户分布:500个用户产生1万条订单
  • 品类权重:奶粉和纸尿裤占比最高

2. 基础分析:月度销售报表生成

2.1 按月统计销售额

市场部需要月度销售趋势报告,核心是计算每月总销售额:

monthly_sales = ( df.groupby(pd.Grouper(key='order_date', freq='M')) ['amount'].sum().round(2) ) print(monthly_sales)

输出:

order_date 2023-01-31 98245.23 2023-02-28 89231.67 2023-03-31 105678.94 2023-04-30 97654.12 2023-05-31 108765.89 2023-06-30 101234.56 Freq: M, Name: amount, dtype: float64

关键技巧

  • pd.Grouper实现按时间维度分组
  • freq='M'指定按月聚合
  • 只选择amount列进行求和计算

2.2 带排序的品类销售分析

运营团队需要知道哪些品类贡献最大:

category_sales = ( df.groupby('category', sort=False) # 保持原始品类顺序 ['amount'].agg(['sum', 'count']) .sort_values('sum', ascending=False) .rename(columns={'sum': '总销售额', 'count': '订单量'}) ) print(category_sales)

输出:

总销售额 订单量 品类 奶粉 312456.78 3012 纸尿裤 265432.10 2508 辅食 198765.43 1998 洗护 119876.54 1503 玩具 87654.32 979

参数解析

  • sort=False避免自动按字母排序
  • agg同时计算销售额和订单量
  • rename优化中文列名提升可读性

3. 进阶分析:用户价值分群

3.1 计算用户平均订单价值(AOV)

识别高价值用户是精细化运营的基础:

user_stats = df.groupby('user_id').agg( total_spent=('amount', 'sum'), order_count=('order_id', 'count'), first_order=('order_date', 'min'), last_order=('order_date', 'max') ).assign( aov=lambda x: x['total_spent'] / x['order_count'] ).sort_values('aov', ascending=False) print(user_stats.head())

输出示例:

total_spent order_count first_order last_order aov user_id UID042 5892.31 23 2023-01-05 2023-06-28 256.19 UID127 5234.56 21 2023-01-12 2023-06-15 249.26 UID003 4876.54 20 2023-01-07 2023-06-20 243.83 UID256 4621.98 19 2023-01-10 2023-06-22 243.26 UID489 4387.65 18 2023-01-15 2023-06-18 243.76

创新点

  • 使用assign动态计算新列
  • 组合多个聚合函数全面刻画用户特征
  • 保留时间信息用于后续RFM分析

3.2 用户品类偏好分析

通过交叉分析发现用户购买偏好:

user_category = ( df.groupby(['user_id', 'category']) .size().unstack(fill_value=0) .apply(lambda x: x / x.sum(), axis=1) ) print(user_category.loc['UID003'].sort_values(ascending=False))

输出:

category 奶粉 0.35 纸尿裤 0.30 辅食 0.20 洗护 0.10 玩具 0.05 Name: UID003, dtype: float64

业务价值

  • unstack实现行列转换
  • 标准化处理显示占比而非绝对值
  • 可用于个性化推荐和精准营销

4. 高级技巧:复购率计算与参数优化

4.1 品类复购率计算

复购率是衡量用户忠诚度的重要指标:

# 标记每个用户的品类购买次数 purchase_counts = ( df.groupby(['user_id', 'category']) ['order_id'].count().reset_index() .rename(columns={'order_id': 'purchase_count'}) ) # 计算复购用户占比 repurchase_rate = ( purchase_counts[purchase_counts['purchase_count'] > 1] .groupby('category')['user_id'].count() / purchase_counts.groupby('category')['user_id'].count() ).round(3) print(repurchase_rate.sort_values(ascending=False))

输出:

category 纸尿裤 0.428 奶粉 0.412 辅食 0.385 洗护 0.321 玩具 0.298 dtype: float64

4.2 性能优化技巧

处理百万级数据时,这些参数调整可提升5-10倍性能:

# 优化后的分组操作 optimized_groupby = df.groupby( 'user_id', as_index=False, # 避免创建多层索引 sort=False, # 跳过排序步骤 observed=True # 仅处理实际存在的组 ).agg( total_spent=('amount', 'sum'), order_count=('order_id', 'count') )

参数对比

参数默认值优化值适用场景
as_indexTrueFalse需要扁平化输出时
sortTrueFalse不需要排序结果时
observedFalseTrue分类数据存在空组时

5. 可视化呈现分析结果

5.1 月度销售趋势图

import matplotlib.pyplot as plt plt.style.use('seaborn') monthly_sales.plot( kind='bar', title='2023年上半年月度销售额', ylabel='销售额(元)', figsize=(10, 6) ) plt.xticks(rotation=0) plt.tight_layout() plt.show()

5.2 用户价值矩阵

user_stats.plot( kind='scatter', x='order_count', y='aov', c='total_spent', cmap='viridis', alpha=0.6, figsize=(10, 6), title='用户价值矩阵' ) plt.xlabel('购买频次') plt.ylabel('客单价(元)') plt.colorbar(label='累计消费金额') plt.grid(True) plt.show()

在实际项目中,我发现groupby的as_index参数经常被忽视。当需要将分组列保留为普通列进行后续处理时,设置as_index=False能省去很多reset_index操作。例如生成Excel报表时,扁平化结构更利于业务人员阅读。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 0:11:05

005、四元数与欧拉角互转:一次炸机事故教会我的事

005、四元数与欧拉角互转:一次炸机事故教会我的事 去年夏天,我在调试一架自组四轴时遇到了一个诡异的问题:飞机在地面站里姿态显示正常,但一解锁起飞就疯狂翻滚,不到两秒就炸了。反复检查了传感器数据、PID参数、电机映射,都没发现问题。最后在日志里发现,飞控输出的欧…

作者头像 李华
网站建设 2026/4/30 0:08:24

AI伦理官2026认证路线:软件测试从业者的专业转型指南

在人工智能技术飞速发展的2026年,AI伦理官已成为全球科技领域的关键角色,负责确保算法决策的公平性、透明性和合规性。随着各国监管框架(如欧盟AI法案和中国《人工智能科技伦理审查与服务办法》)的强制执行,企业对AI伦…

作者头像 李华
网站建设 2026/4/29 23:57:46

学会Skill开发后,我的月薪涨了1万5

会写脚本不值钱,会设计AI系统才值钱今年3月,字节2026年春招,“测试开发工程师-开发者AI”岗位,硬性要求里多了一个词:对AI Agent有深入理解和实践经验。阿里“通义实验室-技术专家-测试开发”岗位,要求熟练…

作者头像 李华
网站建设 2026/4/29 23:55:02

Vivado里用XPM例化URAM,手把手教你搞定UltraScale+ FPGA的大容量存储

Vivado中XPM例化URAM的实战指南:解锁UltraScale FPGA大容量存储潜力 在图像处理、网络数据包缓存等高性能应用场景中,传统BRAM资源常常捉襟见肘。Xilinx UltraScale FPGA提供的URAM(Ultra RAM)资源以其288Kbit的单块容量成为大容量…

作者头像 李华
网站建设 2026/4/29 23:54:26

基于安卓的家具AR摆放预览系统毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓平台的家具增强现实(AR)摆放预览系统,以解决传统家具购买过程中存在的空间适配性评估难题与…

作者头像 李华