ArcGIS Pro脚本实现重复值同排名并维持序列的排名需求
ArcGIS Pro工具箱脚本:重复值相同排名的实现
在ArcGIS Pro工具箱脚本开发中,需要基于数值分配递增排名,要求重复数值分配相同排名,同时维持整体序列的连续性(即重复值占用对应位次,后续排名跳过重复的位次)。
错误结果
| 数值 | 排名 |
|---|---|
| 400 | 1 |
| 500 | 2 |
| 175 | 3 |
| 250 | 4 |
| 120 | 5 |
| 250 | 6 |
期望的正确结果
| 数值 | 排名 |
|---|---|
| 500 | 1 |
| 400 | 2 |
| 250 | 3 |
| 250 | 3 |
| 175 | 5 |
| 120 | 6 |
当前未处理重复值的代码
d = {'value': [500,120,175,400,250,250], 'rank': [0,0,0,0,0,0]} df = pd.DataFrame(data=d) rank1 = df['value'] rank1 = rank1.sort_values(ascending=False) rank1 = rank1.to_numpy() rank2 = np.arange(1,len(rank1)+1,1)
当前输出
rank1: [500 400 250 250 175 120] rank2: [1 2 3 4 5 6]
期望输出
rank2: [1 2 3 3 5 6]
解决方案
直接利用pandas的rank()方法,指定method='min'即可实现重复值分配相同排名,且后续排名跳过重复位次的需求:
d = {'value': [500,120,175,400,250,250], 'rank': [0,0,0,0,0,0]} df = pd.DataFrame(data=d) # 计算排名,ascending=False表示降序排列,method='min'让重复值取最小排名 df['rank'] = df['value'].rank(ascending=False, method='min').astype(int) # 按value降序查看结果 sorted_df = df.sort_values('value', ascending=False) print("rank1:", sorted_df['value'].to_numpy()) print("rank2:", sorted_df['rank'].to_numpy())
代码说明
ascending=False:按数值从大到小排名,匹配最高值排第1位的需求method='min':对重复数值分配它们对应的最小排名,后续排名自动跳过重复值占用的位次(如两个250都排第3,下一个数值直接排第5)astype(int):将浮点型的排名结果转为整数,和期望输出格式一致
内容的提问来源于stack exchange,提问作者map cowboy
相关产品推荐
相关产品推荐

