在Python中如何在组内进行排名?

在Python中如何在组内进行排名?,python,pandas,dataframe,rank,Python,Pandas,Dataframe,Rank,我有以下数据框 A> 现在我想插入一个新列“Bucket\u Rank”,它根据“Count”的降序值在每个“Bucket”下排列“C” 所需输出: B> 我尝试了下面链接中给出的解决方案 命令:B[“Bucket_Rank”]=A.groupby(“Bucket”)[“Count”].Rank(“稠密”,升序=False) 但是它给了我以下的错误 TypeError: rank() got multiple values for argument 'axis' During handlin

我有以下数据框

A>

现在我想插入一个新列“Bucket\u Rank”,它根据“Count”的降序值在每个“Bucket”下排列“C”

所需输出: B>

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

命令: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使用
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
应该也能工作。

是的,你需要通过
method='dense'
。显式指定每个关键字参数。看看我的答案。@cᴏʟᴅsᴘᴇᴇᴅ 谢谢
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
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