Python Pandas:基于多列获取门店SKU上次价格变动日期
解决方法
先修正语法错误
你之前的代码里groupby是方法,必须用括号调用而非方括号,正确写法是df.groupby(['store_nbr', 'product_sku'])。但就算修正语法,max()也只能拿到每个组的最大日期,无法实现「上次价格变动日期」的需求,得按以下步骤处理:
实现「上次价格变动日期」的正确步骤
先对数据排序:确保每个
store_nbr/product_sku组合下的记录按日期升序排列,这样才能正确追踪价格变动的先后顺序df = df.sort_values(['store_nbr', 'product_sku', 'date'])标记价格变动的行:对比每个组内当前行与上一行的价格,找出价格发生变化的记录
# 计算每个组内价格是否变动(diff()得到当前与上一行的差值,ne(0)表示差值不为0即变动) df['price_changed'] = df.groupby(['store_nbr', 'product_sku'])['price'].diff().ne(0)生成变动日期并向前填充:只在价格变动的行保留当前日期,其他行用
NaN,再通过向前填充(ffill)让每一行拿到最近的上次变动日期# 仅价格变动的行保留日期,其余为NaN df['temp_change_date'] = df['date'].where(df['price_changed']) # 按组向前填充,得到每个行对应的上次价格变动日期 df['date_price_change'] = df.groupby(['store_nbr', 'product_sku'])['temp_change_date'].ffill()清理临时列(可选):如果不需要中间生成的临时列,可以删除
df = df.drop(['price_changed', 'temp_change_date'], axis=1)
补充说明
- 每个
store_nbr/product_sku组合的第一行记录,因为没有之前的价格变动,date_price_change会是NaN,你可以根据业务需求用fillna()填充(比如填充为当前行的date,或者保持NaN) - 由于先按日期升序排序,向前填充后的变动日期必然小于等于当前行的
date,如果要严格小于,可以额外加判断:df['date_price_change'] = df.apply( lambda x: x['date_price_change'] if x['date_price_change'] < x['date'] else None, axis=1 )
内容的提问来源于stack exchange,提问作者Derwoody
相关产品推荐
相关产品推荐

