Python动态DataFrame获取玩家排名报错:索引越界问题求助
搞定IndexError:玩家排名查询的问题修复
嘿,我来帮你解决这个头疼的索引越界错误!先给你捋清楚问题出在哪,再给你上修正后的代码:
为啥会报错?
- 排序没生效:你写的
df.sort_values(by="Donated Trees", ascending=False)其实没改变原DataFrame——pandas大多数方法默认返回新对象,不修改原数据,相当于白排序了,后续查找自然会出问题。 - 空结果触发索引越界:你把
Rank设为索引后,用df['Name'] == self.player.name筛选时,如果没匹配到玩家(比如名字写错、或者DataFrame里压根没这个玩家),返回的是个空Series,这时候调用iloc[0]肯定会报错,因为根本没数据可取。 - Position计算有点绕:其实你要的总排名位置,完全可以用更简单的方式生成,没必要绕两层rank。
修正后的代码(推荐版)
这个版本逻辑更清晰,还加了容错处理,再也不会触发索引越界:
import pandas as pd # 假设names、trees是你已有的玩家名单和捐赠树数量,self.player.name是当前玩家的名字 df = pd.DataFrame({'Name': names, 'Donated Trees': trees}) # 1. 计算稠密排名(相同捐赠数的玩家排名相同) df['Rank'] = df['Donated Trees'].rank(method='dense', ascending=False).astype(int) # 2. 按捐赠数降序排序,直接修改原DataFrame df.sort_values(by="Donated Trees", ascending=False, inplace=True) # 重置索引,这样可以直接用索引+1生成总排名位置(索引从0开始,加1就是第1、第2位...) df.reset_index(drop=True, inplace=True) df['Position'] = df.index + 1 # 3. 安全查询玩家排名:先判断是否找到玩家 player_data = df[df['Name'] == self.player.name] if not player_data.empty: end_position = str(player_data['Position'].iloc[0]) print(f"你的排名是总人数中的第{end_position}位") else: print("未找到你的游戏记录,请检查名字是否正确哦")
如果你想保留原有的Rank逻辑
要是你坚持要用两层rank计算Position,那也可以这么改,重点是加空值判断和让排序生效:
import pandas as pd df = pd.DataFrame({'Name': names, 'Donated Trees': trees}) df['Rank'] = df['Donated Trees'].rank(method='dense', ascending=False).astype(int) # 用min方法直接计算总排名位置,不用再套一层rank df['Position'] = df['Donated Trees'].rank(method='min', ascending=False).astype(int) # 排序必须生效!加inplace=True df.sort_values(by="Donated Trees", ascending=False, inplace=True) # 安全获取位置:先检查是否有匹配结果 player_position = df.loc[df['Name'] == self.player.name, 'Position'] if not player_position.empty: end_position = str(player_position.iloc[0]) else: end_position = "未找到" print(f"你的排名是总人数中的第{end_position}位")
这样调整后,不仅能解决索引越界的问题,代码逻辑也更易懂,还能处理玩家不存在的异常情况~
内容的提问来源于stack exchange,提问作者Anonymosaurus
相关产品推荐
相关产品推荐

