【问题标题】:Pandas rolling window rank order with condition熊猫滚动窗口等级顺序有条件
【发布时间】:2021-04-02 17:31:12
【问题描述】:

我想我的 Pandas DataFrame 如下所示:

  account   amount  
  A         10      
  A         10      
  A         20      
  A         10      
  A         10      
  A         10      
  B         10      
  B         10      
  B         20      
  B         18      
  B         18      
  B         12      
  B         14      
  B         18      
  B         19      

我想要一个如下所示的新列:

  account   want  
  A         nan   
  A         nan   
  A         1     
  A         2     
  A         3     
  A         1     
  B         nan   
  B         nan   
  B         1     
  B         2     
  B         3     
  B         1     
  B         2     
  B         1     
  B         1     

这个想法是在给定窗口中找到最大值之后排列顺序(从 1 开始)。

例如,给定的窗口是3,账户A,最大金额是20。然后,索引2 将返回1,因为20 是给定窗口中的最大值。之后,对于下一个滚动窗口,索引 3 将返回 2,因为金额为 10,小于上面的 20

将逻辑应用到帐户B,结果如图所示。我可以考虑用 3 创建最大数量的滚动窗口,但我不能再做进一步了。

【问题讨论】:

  • 输出中的A 3 背后的逻辑是什么?不应该是2吗?
  • 在索引 4 处,数量为 10,而过去 3 个窗口的最大数量为 20。然后,它从 20 排名为 3(从 1 开始)。 [20, 10, 10] = [1, 2, 3]
  • 您能进一步解释一下您的滚动窗口是如何工作的吗?索引 2 的值不应该是 20,索引 3 的值不应该是 20 吗?
  • 基本上,我想在滚动窗口中找到最大值之后对顺序进行排序。考虑第一个窗口 [10, 10, 20],在索引 2 处最大值为 20,值返回 1。考虑第二个窗口 [10, 20, 10] 最大值仍为 20 但索引更改为 1,金额为索引 3 为 10,而最大值为 20。然后,它将从包含 20 的索引进行排名并返回为 2
  • 按照相同的逻辑,A 组的最后两个值是 3 和 1 怎么办?我了解 3,但不了解 1。

标签: python pandas dataframe conditional-statements rolling-computation


【解决方案1】:

我想我可以通过下面的代码解决这个问题:

def rank(window):
    newWindow = np.array(window)
    lastMax = np.where(newWindow == np.amax(newWindow))[0][-1]
    maxLocation = np.repeat(lastMax, newWindow.shape[0])
    location = np.arange(0, newWindow.shape[0])    
    ranks = location - maxLocation + 1
    return ranks[-1]

df['want'] = df.groupby('account')['amount'].rolling(window = 3).apply(rank).droplevel(0)

谢谢大家!

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 2017-04-08
    • 2020-04-21
    • 2021-03-30
    • 2020-09-21
    • 1970-01-01
    • 2020-09-18
    • 2018-07-10
    • 2017-04-03
    相关资源
    最近更新 更多