[英]Pandas rolling window rank order with condition
我想我有 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
這個想法是在給定 window 中找到最大值之后對順序(從 1 開始)進行排序。
例如,給定的 window 為3
,在賬戶A
中,最大金額為20
。 然后,索引2
將返回1
,因為20
是給定 window 中的最大值。 之后,對於下一個滾動 window,在索引3
處將返回2
,因為數量為10
,比上面的20
少。
將邏輯應用於帳戶B
,結果如圖所示。 我可以考慮用 3 創建最大的滾動 window 數量,但我不能再做進一步了。
我想我可以通過下面的代碼解決這個問題:
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)
感謝大家!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.