如何在Python中排名?

时间:2017-10-29 08:36:30

标签: python pandas dataframe rank

我有以下数据框

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

我尝试了以下链接中给出的解决方案

Ranking order per group in Pandas

命令:B [" Bucket_Rank"] = A.groupby(" Bucket")[" Count"]。排名("密集&# 34;,升序=假)

但它给了我以下错误..

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

During handling of the above exception, another exception occurred:

ValueError      

帮助表示赞赏... TIA

1 个答案:

答案 0 :(得分: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应该也能正常工作。