Я пытаюсь получить скользящий рейтинг на основе группы. Это мои демо-данные, ожидаемый столбец «Постоянный двухлетний рейтинг».
Это работает так: я собираюсь сгруппировать по каждому «ID» и вычислить ранг на основе его собственного исторического «значения».
df = pd.DataFrame({
'Year': [2000,2000,2000,2001,2001,2001,2002,2002,2002,2003,2003,2003],
'ID': ['A','B','C','A','B','C','A','B','C','A','B','C'],
'Value': [5,1,2,3,4,3,2,7,1,1,13,23],
'Rolling 2Y Rank': [np.nan,np.nan,np.nan, 2,1,1,2,1,2,2,1,1]})
Например, для «ID»="A":
df[df['ID']=='A']
Я пробовал и не получилось:
df.groupby('ID')['Value'].rolling(2).rank()
@PrathikKini Желаемый результат: Rolling 2Y Rank
. Я добавил таблицу.
Вам нужен обратный (нисходящий) ранг, поэтому передайте его функции ранга . Затем вы можете сделать merge
, чтобы вернуть исходный фрейм данных:
df = df.merge(
df.groupby('ID').rolling(2, on='Year')['Value'].rank(ascending=False),
on=['ID','Year'],
)
Выход:
Year ID Value_x Value_y
0 2000 A 5 NaN
1 2000 B 1 NaN
2 2000 C 2 NaN
3 2001 A 3 2.0
4 2001 B 4 1.0
5 2001 C 3 1.0
6 2002 A 2 2.0
7 2002 B 7 1.0
8 2002 C 1 2.0
9 2003 A 1 2.0
10 2003 B 13 1.0
11 2003 C 23 1.0
Вот способ использования .rolling().agg()
df.groupby('ID')['Value'].rolling(2).agg(lambda x: x.rank(method = 'dense',ascending=False).iloc[-1]).droplevel(0).sort_index()
Выход:
0 NaN
1 NaN
2 NaN
3 2.0
4 1.0
5 1.0
6 2.0
7 1.0
8 2.0
9 2.0
10 1.0
11 1.0
Вставьте введенные данные и ожидаемый результат в формате таблицы.