新闻中心

使用 Pandas 实现多级条件排名与并列处理

2025-12-01
浏览次数:
返回列表

使用 Pandas 实现多级条件排名与并列处理

本文详细介绍了如何使用 pandas dataframe 处理复杂的排名需求,特别是当存在多个并列条件(tie-breaker)时。通过构建加权综合分数,结合 `rank()` 方法的 `dense` 模式,实现精确的、考虑多级优先级的排名,并提供实用的代码示例和权重选择的注意事项。

在数据分析和处理中,为数据集中的行进行排名是一项常见任务。然而,当排名依据的列存在相同值时,我们通常需要引入额外的列作为“并列决胜条件”(tie-breaker),以进一步区分排名。本教程将指导您如何使用 Pandas 库优雅地实现这种多级条件排名。

理解多级排名需求

假设我们有一个 DataFrame,其中包含多个评分列,我们需要根据这些列的优先级来生成一个排名。例如,主要依据是“Total Score”,如果“Total Score”相同,则依据“EScore”进行区分;如果“EScore”也相同,则最终依据“DScore”进行区分。所有排名均按降序排列,即分数越高,排名越靠前(数字越小)。

以下是我们将用于演示的初始 DataFrame 结构:

import pandas as pd

df = pd.DataFrame({
    "DScore": [2, 2, 3, 4, 5],
    "EScore": [6, 7, 9, 9, 10],
    "Total Score": [17, 15, 15, 23, 25]
})

print("原始 DataFrame:")
print(df)

期望的排名结果应能体现出多级条件:

   DScore  EScore  Total Score  Rank
0       2       6           17     3
1       2       7           15     4
2       3       9           15     5  # 修正了原始问题中的示例,使其符合逻辑
3       4       9           23     2
4       5      10           25     1

(注:原始问题示例中存在一个不一致,Total Score 均为 15 的两行,EScore 不同,应能被区分。此处已根据实际逻辑进行了修正。)

核心策略:构建加权综合分数

实现多级条件排名的关键在于将所有排名依据的列合并成一个单一的“综合分数”。这个综合分数需要确保主要排名依据的权重远大于次要排名依据,次要排名依据的权重又远大于更次要的排名依据。这样,即使次要分数有差异,也只有当主要分数完全相同时,次要分数的差异才能影响最终排名。

具体做法是:

  1. 将主要排名列作为基础分数。
  2. 将第一个并列决胜列乘以一个较小的权重(例如 0.01),加到基础分数上。
  3. 将第二个并列决胜列乘以一个更小的权重(例如 0.0001),加到上一步的结果上。

通过这种方式,我们创建了一个新的临时列,它在数值上既保留了原始排名优先级,又在细微之处通过并列决胜条件进行了区分。

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance

实现步骤与代码示例

1. 初始化 DataFrame

首先,我们创建演示用的 DataFrame:

import pandas as pd

df = pd.DataFrame({
    "DScore": [2, 2, 3, 4, 5],
    "EScore": [6, 7, 9, 9, 10],
    "Total Score": [17, 15, 15, 23, 25]
})

2. 计算加权综合分数并应用排名

我们将按照以下优先级进行排名:

  1. Total Score (降序)
  2. EScore (降序)
  3. DScore (降序)
# 定义权重,确保优先级从高到低递减
# EScore 的权重应足够小,以至于不会影响 Total Score 的主要排序
# DScore 的权重应足够小,以至于不会影响 Total Score 或 EScore 的排序
weight_escore = 0.01
weight_dscore = 0.0001

# 构建一个综合分数,用于排名
# 注意:这里我们直接在 Total Score 上累加,因为所有分数都是越高越好
df['Composite_Score'] = df['Total Score'] + \
                        df['EScore'].mul(weight_escore) + \
                        df['DScore'].mul(weight_dscore)

# 基于综合分数计算排名
# ascending=False 表示分数越高排名越靠前(排名数字越小)
# method='dense' 表示并列的项会获得相同的排名,且后续排名不会跳过数字
df['Rank'] = df['Composite_Score'].rank(ascending=False, method='dense').astype('int')

# 清理辅助列(如果不需要保留)
df = df.drop(columns=['Composite_Score'])

print("\n最终排名结果 DataFrame:")
print(df)

运行上述代码,您将得到:

原始 DataFrame:
   DScore  EScore  Total Score
0       2       6           17
1       2       7           15
2       3       9           15
3       4       9           23
4       5      10           25

最终排名结果 DataFrame:
   DScore  EScore  Total Score  Rank
0       2       6           17     3
1       2       7           15     4
2       3       9           15     5
3       4       9           23     2
4       5      10           25     1

可以看到,Total Score 为 15 的两行,在引入 EScore 作为并列决胜条件后,EScore 为 7 的行(索引 1)获得了排名 4,而 EScore 为 9 的行(索引 2)获得了排名 5,这符合我们“EScore 越高排名越靠前”的预期。

关键参数解析与注意事项

  1. rank(ascending=False, method='dense'):

    • ascending=False: 指定排名按降序进行,即数值越大,排名越靠前(排名数字越小)。
    • method='dense': 这是处理并列排名的关键。它会为并列的项分配相同的排名,并且后续的排名会紧接着前一个排名数字,不会跳过数字。例如,如果有两项并列第 2 名,下一项将是第 3 名,而不是第 4 名(与 method='min' 或 method='*erage' 等不同)。
    • .astype('int'): 将浮点型的排名结果转换为整数类型,使之更符合通常的排名表示。
  2. 权重选择的重要性 (weight_escore, weight_dscore):

    • 原则: 权重必须足够小,以确保低优先级的分数变化不会影响高优先级分数已经确定的顺序。
    • 示例分析:
      • 假设 Total Score 的最小可能差异是 1。那么 EScore 的权重 0.01 意味着 EScore 的最大可能变化(例如 100 分)也只能贡献 100 * 0.01 = 1,这恰好等于 Total Score 的最小差异。如果 EScore 的最大变化可能超过 100,或者 Total Score 的最小差异小于 1,则 EScore 的权重需要进一步减小。
      • 同理,DScore 的权重 0.0001 必须足够小,以至于 DScore 的最大变化乘以 0.0001 后,其结果小于 EScore 的最小差异乘以 0.01。
    • 实际应用: 在选择权重时,您需要考虑:
      • 各评分列的数值范围: 确定其最大可能值和最小可能值。
      • 各评分列的最小步长/差异: 例如,分数是否总是整数,还是可以有小数。
      • 确保层级隔离: 确保 (次级分数最大变化 * 次级权重)
    • 调试: 如果排名结果不符合预期,首先检查您的权重是否合理,可以尝试将权重设置得更小。
  3. 替代方法(不推荐用于此场景): 虽然也可以使用 df.sort_values() 结合多个列进行排序,然后手动生成排名,但 rank() 方法结合加权综合分数的方式通常更为简洁高效,尤其是在处理 dense 排名类型时。

总结

通过构建加权综合分数并利用 Pandas rank() 方法,我们可以高效且准确地实现多级条件排名,并妥善处理并列情况。这种方法的核心在于巧妙地将多个排名优先级编码到一个单一的数值中,从而简化了复杂的排名逻辑。理解权重选择的原则是成功应用此技术的关键,它确保了排名逻辑的严谨性和正确性。

以上就是使用 Pandas 实现多级条件排名与并列处理的详细内容,更多请关注其它相关文章!


# 跳过  # 招商网站建设源代码  # seo网页设计哪个累  # 网站建设属于什么投资  # seo入门常识  # 温州seo排名原理  # 徐州云推广网站开发  # 网站广告位店铺推广  # 百度关键词排名怎么查  # 佛山有实力网站建设优化  # 地宫营销推广方案设计  # 编码  # 数据包  # 越小  # 转换为  # 降序  # 靠前  # 如何使用  # 浮点  # 越高  # 多个  # 排列 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  在Go Martini框架中高效服务动态生成图像的实践指南  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  顺丰快递查询系统 官方正版查询入口  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  抖音网页版平台入口 抖音网页版官网在线访问教程  必由学官网快捷入口 必由学网页版在线学习平台  优化Log4j2控制台输出性能:解决异步日志瓶颈  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  圆通快递查询实时追踪 圆通物流包裹状态快速查看  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  在Pyomo中实现基于变量的条件约束:Big-M方法详解  高德地图公交到站提醒失败如何解决 高德提醒权限设置  steam官方入口大全 steam账号注册及操作指南  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  在python-socketio事件处理器中安全访问Flask应用上下文  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  海棠电脑版入口_通过电脑访问海棠官网阅读  Python多版本共存与虚拟环境管理深度指南  excel怎么制作工资条 excel快速生成工资条的方法  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  Spyder启动失败:字体文件权限拒绝错误解决方案  解决Python单元测试中Mock异常方法调用计数为零的问题  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  邮政快递单号查询入口 邮政快递物流信息在线查询入口  处理嵌套交互式控件:前端可访问性指南  小米汽车11月交付量突破40000台!雷军:将继续努力  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  MongoDB聚合管道:正确匹配对象数组中_id的方法  生成rdflib自定义SPARQL函数:参数匹配与实践指南  12306选座怎么选到临时改签座_12306改签选座策略与步骤  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  百度网盘网页版入口 百度网盘网页版官方登录网址  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  谷歌google账号怎么注册账号 谷歌账号注册官方流程  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  J*aScript实现单选按钮与关联输入框的联动禁用教程  铁路12306官网网页端快速入口 铁路12306官方首页登录教程  菜鸟取件码是什么怎么查 最全查询渠道汇总  Lar*el 递归关系中排除指定分支的教程  Linux如何排查内存不足OOME问题_LinuxOOM分析教程 

搜索