如何用for循环和函数提取全年数据中上月销售退货数据,groupby参数如何设置
实现方案
你不需要用for循环实现,直接用pandas内置的groupby+shift组合即可完成需求,具体步骤如下:
- 先完成数据预处理,确保日期列格式正确且按时间排序
import pandas as pd # 替换为你实际的日期列名 df['date'] = pd.to_datetime(df['date']) # 按日期升序排序,保证时间顺序正确 df = df.sort_values('date').reset_index(drop=True)
- 确定
groupby的参数:groupby需要填写你统计维度的唯一标识字段,比如你需要按单个商品统计上月的销售/退货数据,就填商品唯一ID列(比如product_id);如果你需要按「门店+商品」的组合维度统计,就填['store_id', 'product_id'],根据你的实际业务场景调整字段即可。 - 生成上月数据列
如果你的原表已经是按维度+月度聚合好的数据,直接用如下代码:
# 替换groupby的维度字段、替换为你实际的当月销量/退货列名 df['sales quantity'] = df.groupby('product_id')['当月销量列名'].shift(1) df['return quantity'] = df.groupby('product_id')['当月退货列名'].shift(1)
如果你的原表是单条交易明细数据,需要先做月度聚合再关联回原表:
# 先按维度+月度聚合统计 monthly_stat = df.groupby( ['product_id', pd.Grouper(key='date', freq='M')] ).agg( 月度总销量=('销量列名', 'sum'), 月度总退货=('退货列名', 'sum') ).reset_index() # 生成上月数据 monthly_stat['sales quantity'] = monthly_stat.groupby('product_id')['月度总销量'].shift(1) monthly_stat['return quantity'] = monthly_stat.groupby('product_id')['月度总退货'].shift(1) # 关联回原表保留所有原始列 df['month'] = df['date'].dt.to_period('M') monthly_stat['month'] = monthly_stat['date'].dt.to_period('M') df = df.merge( monthly_stat[['product_id', 'month', 'sales quantity', 'return quantity']], on=['product_id', 'month'], how='left' ).drop('month', axis=1)
注意事项
- 每个月最早的一条数据因为没有上月数据,对应
sales quantity和return quantity会返回空值,属于正常逻辑 - 如果你的统计维度包含多个字段,直接把所有维度字段添加到
groupby的参数列表中即可
内容的提问来源于stack exchange,提问作者Astha_H
相关产品推荐
相关产品推荐

