在Python中如何在组内进行排名?
我有以下数据框 A> 现在我想插入一个新列“Bucket\u Rank”,它根据“Count”的降序值在每个“Bucket”下排列“C” 所需输出: B> 我尝试了下面链接中给出的解决方案 命令:B[“Bucket_Rank”]=A.groupby(“Bucket”)[“Count”].Rank(“稠密”,升序=False) 但是它给了我以下的错误在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
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