如何在 Python 的组内排名?

How to rank within a group in Python?

我有以下数据框

一个 >

  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",它根据 "Count"

的降序值在每个 "Bucket" 下排名 "C"

需要的输出: 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

我尝试了下面给出的解决方案link

命令:B["Bucket_Rank"] = A.groupby("Bucket ")["Count"].rank("dense", ascending=False)

但它给我以下错误..

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

During handling of the above exception, another exception occurred:

ValueError      

感谢帮助...TIA

使用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 应该也能正常工作。