如何在Pandas中为DataFrame添加周度排名变化列?
解决按商品周度排名变化计算问题
问题分析
你需要按单个商品维度,计算每周排名相对上周的变化(公式:上周排名 - 当前排名),且第1周需做异常处理。你之前的代码错误在于尝试用行内条件匹配上周数据,这种逻辑无法定位到同商品的上一行数据,自然返回NaN。
正确实现方法
利用groupby+shift方法,无需逐行迭代,简洁高效:
- 先确保数据按商品和周数排序(避免顺序错乱导致计算错误)
- 按商品分组后,对
ranking列执行shift(1)操作,获取同商品的上周排名 - 按公式计算排名变化,最后对第1周的数据做异常处理
完整代码示例
import pandas as pd # 示例数据 df = pd.DataFrame({ 'item_name': ['test', 'test', 'apple', 'apple'], 'ranking': [4, 3, 2, 1], 'week_number': [1, 2, 1, 2] }) # 1. 按商品和周数排序(关键:保证同商品的周数据连续且按顺序排列) df = df.sort_values(by=['item_name', 'week_number']).reset_index(drop=True) # 2. 分组获取上周排名 df['ranking_previous_week'] = df.groupby('item_name')['ranking'].shift(1) # 3. 计算排名变化,第1周设为0(或NaN,根据需求调整) df['ranking_evolution'] = df['ranking_previous_week'] - df['ranking'] df.loc[df['week_number'] == 1, 'ranking_evolution'] = 0 # 第1周异常处理,设为0 print(df)
输出结果
item_name ranking week_number ranking_previous_week ranking_evolution 0 apple 2 1 NaN 0.0 1 apple 1 2 2.0 1.0 2 test 4 1 NaN 0.0 3 test 3 2 4.0 1.0
关键说明
groupby('item_name')['ranking'].shift(1):将每个商品组内的ranking数据向下移动一行,刚好对应同商品的上周排名,第1周没有上周数据,所以返回NaN- 异常处理可根据需求调整:比如把第1周的
ranking_evolution设为NaN,只需把最后一行代码改成df.loc[df['week_number'] == 1, 'ranking_evolution'] = pd.NA
内容的提问来源于stack exchange,提问作者etieno
相关产品推荐
相关产品推荐

