新闻中心

Pandas中基于多列条件进行排名及处理并列情况的教程

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

Pandas中基于多列条件进行排名及处理并列情况的教程

本教程详细介绍了如何在pandas dataframe中实现多级条件排名,特别是当主排名列存在并列情况时,如何利用次要列和第三列作为破平器。通过构建一个加权复合分数,并结合`rank`函数的`method='dense'`参数,我们能够精确地为数据行分配排名,有效解决复杂的排名逻辑需求,确保排名结果的准确性和一致性。

Pandas DataFrame多级条件排名与并列处理

在数据分析中,我们经常需要对数据进行排名。然而,简单的单列排名往往无法满足复杂的需求,特别是在存在并列值时,我们可能需要依据其他列作为“破平器”来进一步区分排名。本教程将深入探讨如何在Pandas DataFrame中实现这种多级条件排名逻辑。

问题场景描述

假设我们有一个包含多个分数(例如DScore, EScore, Total Score)的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)

期望的排名结果如下(注意索引1和2的Total Score均为15,但EScore不同,因此排名不同;索引2和3的Total Score均为23,EScore均为9,但DScore不同,因此排名不同):

   DScore  EScore  Total Score  Rank
0       2       6           17     3
1       2       7           15     4
2       4       9           23     2
3       4       9           23     2
4       5      10           25     1

注:上述期望结果与原始问题略有差异,已根据问题描述的逻辑进行了修正,以更好地体现多级破平器的作用。例如,如果DScore: [2, 2, 4, 4, 5], EScore: [6, 7, 9, 9, 10], Total Score: [17, 15, 23, 23, 25],那么索引2和3的Total Score和EScore都相同,此时需要DScore来破平。如果DScore也相同,则它们才获得相同的排名。

解决方案:加权复合分数法

解决此类问题的有效方法是创建一个“复合分数”列。这个复合分数是通过将主排名列与次要排名列(破平器)进行加权求和得到的。关键在于为破平器列分配足够小的权重,以确保它们只在主排名列的值完全相同时才发挥作用。

步骤1:确定排名优先级和权重

  1. 主排名列: 'Total Score' (权重最高)
  2. 第一破平器: 'EScore' (权重次之)
  3. 第二破平器: 'DScore' (权重最低)

为了使破平器仅在主分数相同的情况下生效,我们需要将破平器的权重设置得足够小,使其加到主分数上时,不会改变主分数不同时的相对大小关系。例如,如果主分数相差1,那么破平器的最大可能加权值必须小于1。

步骤2:计算加权复合分数

TTSMaker TTSMaker

TTSMaker是一个免费的文本转语音工具,提供语音生成服务,支持多种语言。

TTSMaker 2275 查看详情 TTSMaker

我们将'EScore'乘以一个较小的系数(如0.01),将'DScore'乘以一个更小的系数(如0.0001),然后将这些加权值添加到'Total Score'上。

# 原始DataFrame
df = pd.DataFrame({
    "DScore": [2, 2, 4, 4, 5], # 修正DScore以更好地演示破平
    "EScore": [6, 7, 9, 9, 10],
    "Total Score": [17, 15, 23, 23, 25]
})

# 计算加权复合分数
# Total Score 是主排名依据,EScore 是第一破平器,DScore 是第二破平器
# 权重选择:确保EScore的加权值不足以影响Total Score的整数差异
# 确保DScore的加权值不足以影响EScore的加权值差异
df['Composite Score'] = df['Total Score'] + \
                        df['EScore'].mul(0.01) + \
                        df['DScore'].mul(0.0001)

print("\n带有复合分数的DataFrame:")
print(df)

步骤3:使用rank()函数进行排名

有了复合分数后,我们就可以直接对这个复合分数列使用Pandas的rank()函数进行排名。

  • ascending=False: 表示分数越高,排名越靠前(即排名值越小)。
  • method='dense': 这个参数非常重要。它确保了在并列情况下,所有并列项获得相同的排名,并且下一个非并列项的排名是紧接着的整数(例如,1, 2, 2, 3, 4,而不是1, 2, 2, 4, 5)。
  • .astype('int'): 将浮点型的排名结果转换为整数,使之更简洁。
df['Rank'] = df['Composite Score'].rank(ascending=False, method='dense').astype('int')

print("\n最终排名结果DataFrame:")
print(df.drop(columns=['Composite Score'])) # 移除辅助的复合分数列

完整代码示例:

import pandas as pd

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

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

# 计算加权复合分数
# 权重选择:0.01 和 0.0001 是示例值,需要根据实际数据范围进行调整
# 目标是确保加权值不会影响更高优先级列的整数差异
df['Composite Score'] = df['Total Score'].add(df['EScore'].mul(0.01)).add(df['DScore'].mul(0.0001))

# 基于复合分数进行排名
df['Rank'] = df['Composite Score'].rank(ascending=False, method='dense').astype('int')

# 打印最终结果,并删除辅助的复合分数列
print("\n最终排名结果DataFrame:")
print(df.drop(columns=['Composite Score']))

输出结果:

原始DataFrame:
   DScore  EScore  Total Score
0       2       6           17
1       2       7           15
2       4       9           23
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       4       9           23     2
3       4       9           23     2
4       5      10           25     1

从结果可以看出,索引2和3的Total Score和EScore都相同(23和9),但DScore不同(4和4),因此它们获得了相同的排名2。这与我们的预期相符,因为当所有破平器都相同,它们才被视为真正的并列。

注意事项与最佳实践

  1. 权重选择: 示例中的0.01和0.0001是基于假设分数是整数且差异至少为1的情况。在实际应用中,您需要根据数据的具体范围和精度来调整这些权重。
    • 原则: 破平器的最大可能加权值(即破平器列的最大值乘以其权重)必须小于其上一级排名列的最小可能差异。
    • 例如,如果Total Score的最小差异是1,那么EScore的最大值乘以其权重必须小于1。如果EScore的最大值是100,那么其权重应小于0.01。
    • 同样,DScore的最大值乘以其权重,必须小于EScore的最小差异乘以EScore的权重。
  2. method='dense'的重要性: 在需要连续排名的场景中,dense方法是理想选择,它避免了排名中的空缺。如果需要其他并列处理方式(如平均排名、最小排名等),可以查阅rank()函数的其他method参数选项。
  3. 性能考虑: 对于非常大的数据集,创建额外的辅助列会增加内存消耗。然而,对于大多数常见的数据集大小,这种方法的性能是可接受的。
  4. 可读性: 这种方法通过显式创建复合分数,使得排名逻辑非常清晰和易于理解。

总结

通过创建加权复合分数,并结合Pandas rank()函数的强大功能,我们可以优雅地解决DataFrame中基于多列条件进行排名和处理并列情况的复杂需求。这种方法不仅灵活,而且易于理解和实现,是数据分析师处理复杂排名问题的有力工具。理解权重的选择原则是成功应用此方法的关键。

以上就是Pandas中基于多列条件进行排名及处理并列情况的教程的详细内容,更多请关注其它相关文章!


# 是在  # 网站推广技术包括  # 营销推广能力怎么考察  # 西安美橙网站推广  # 美工网站推广  # seo优化教程平台  # 安远seo工具哪个好  # 四川营销短视频推广平台  # 岚县国产网站推广  # 营销推广方案的实例分析  # 装修网站建设工作推荐  # 工具  # 情况下  # 是一个  # 并结合  # 这种方法  # 自定义  # 加权平均  # 以其  # 均为  # 浮点 


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


相关推荐: J*a应用集成GitHub CLI与API认证指南  动漫岛观看全网网 动漫岛在线正版动漫入口  b站怎么删除评论_b站评论管理与删除操作  如何在网页中实现特定地点的随机图片展示  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  微信网页版官方快速登录入口 微信网页版网页版账号直达  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  Python:递归比较文件夹内容并找出特定类型文件的差异  J*aScript DOM操作:高效清空列表元素的策略与实践  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  mysql备份恢复性能优化_mysql备份恢复性能优化方法  如何将HTML表格多行数据保存到Google Sheets  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  必由学在线入口 必由学网页版快速登录入口  抖音怎么赚钱_抖音创作者变现方法与途径指南  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  AngularJS $http POST请求数据传递与Go后端接收实践  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  Golang如何使用new_Go new分配内存机制讲解  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  马斯克:Optimus 人形机器人复数形式为 Optimi  MongoDB聚合管道:正确匹配对象数组中_id的方法  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  Composer如何解决json扩展缺失的错误  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  c++ dfs和bfs代码 c++深度广度优先搜索算法  DLsite中文平台入口 DLsite官网内容在线查看  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  uc浏览器网页版入口 uc浏览器网页版最新网址  浏览器打开即用 美图秀秀网页版入口  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  C#中解析不规范的HTML为XML 常见的坑与解决办法  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  CSS图片焦点样式实现教程:理解与应用tabindex属性  Node.js中HTML按钮与J*aScript函数交互的正确姿势  c++ 获取系统当前时间 c++时间戳获取方法  58动漫网在线官方网 58动漫网正版动漫入口网址  Fabric模组开发:自定义物品与物品组的现代管理方法  J*a TimerTask中HashMap意外清空的深层原因与解决方案 

搜索