Как ранжироваться в группе в Python?

У меня есть следующий фрейм данных

A >

  Bucket    C   Count
PL14    XY23081063  706
PL14    XY23326234  15
PL14    XY23081062  1
PL14    XY23143628  1
FZ595   XY23157633  353
FZ595   XY23683174  107
XM274   XY23681818  139
XM274   XY23681819  108

Теперь я хочу вставить новый столбец «Bucket_Rank», который ранжирует «C» под каждым «Bucket» на основе убывающего значения «Count».

требуемый вывод: B>

Bucket  C   Count   Bucket_Rank
PL14    XY23081063  706 1
PL14    XY23326234  15  2
PL14    XY23081062  1   3
PL14    XY23143628  1   4
FZ595   XY23157633  353 1
FZ595   XY23683174  107 2
XM274   XY23681818  139 1
XM274   XY23681819  108 2

Я попробовал решение, указанное по следующей ссылке

Порядок ранжирования по группе в Pandas

команда: B ["Bucket_Rank"] = A.groupby ("Bucket") ["Count"]. rank ("плотный", по возрастанию = False)

но это дает мне следующую ошибку ..

TypeError: rank() got multiple values for argument 'axis'

During handling of the above exception, another exception occurred:

ValueError      

Помощь оценена ... TIA


person smokinjoe    schedule 29.10.2017    source источник
comment
Ага, нужно сдать method='dense'. Явно укажите каждый аргумент ключевого слова. Смотрите мой ответ.   -  person cs95    schedule 29.10.2017
comment
@ cᴏʟᴅsᴘᴇᴇᴅ спасибо!   -  person smokinjoe    schedule 29.10.2017


Ответы (1)


Используйте groupby + argsort:

v = df.groupby('Bucket').Count\
         .transform(lambda x: np.argsort(-x) + 1)
v

0    1
1    2
2    3
3    4
4    1
5    2
6    1
7    2
Name: Count, dtype: int64

df['Bucket_Rank'] = v

Если вы хотите использовать rank, укажите method='dense'. Лучше явно указать каждый аргумент ключевого слова, чтобы избежать путаницы.

df.groupby("Bucket")["Count"]\
      .rank(method="dense", ascending=False)

0    1.0
1    2.0
2    3.0
3    3.0
4    1.0
5    2.0
6    1.0
7    2.0
Name: Count, dtype: float64

Обратите внимание, что полученный результат не совсем такой, как вы ожидаете, поскольку равным счетам присваивается один и тот же ранг. Если вы можете смириться с этим, rank тоже подойдет.

person cs95    schedule 29.10.2017