You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中为DataFrame添加周度排名变化列?

解决按商品周度排名变化计算问题

问题分析

你需要按单个商品维度,计算每周排名相对上周的变化(公式:上周排名 - 当前排名),且第1周需做异常处理。你之前的代码错误在于尝试用行内条件匹配上周数据,这种逻辑无法定位到同商品的上一行数据,自然返回NaN。

正确实现方法

利用groupby+shift方法,无需逐行迭代,简洁高效:

  1. 先确保数据按商品和周数排序(避免顺序错乱导致计算错误)
  2. 按商品分组后,对ranking列执行shift(1)操作,获取同商品的上周排名
  3. 按公式计算排名变化,最后对第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:16:02