Python DataFrame添加排名列求助:生成1-250唯一排名遇NaN
解决DataFrame排名全为NaN的问题
嘿,我来帮你搞定这个排名的问题!你的代码里有几个小问题导致rank列全是NaN,咱们一步步理清楚:
原代码的问题分析
- 索引不匹配:你用
IMDb_Top_250.nlargest(250,'imdb_score')生成了一个仅包含前250条高分记录的新DataFrame,但直接把它的结果赋值给原DataFrame的rank列时,由于两个DataFrame的索引可能不完全对应(原表可能有更多行),大部分位置会被填充为NaN。 - 错误的排名赋值:
apply(lambda x: range(1,250))完全不符合预期——apply是对每一行/列执行函数,你这里返回的是一个从1到249的序列(还少了第250名),不是单个行对应的排名值。
正确的解法
方法一:直接筛选后赋值连续排名
如果不需要处理同分情况,只想给前250条记录分配1到250的唯一排名,最简单的方式是:
# 1. 获取前250条高分记录,并重置索引(避免原索引干扰) IMDb_Top_250 = IMDb_Top_250.nlargest(250, 'imdb_score').reset_index(drop=True) # 2. 生成1到250的序列作为rank列 IMDb_Top_250['rank'] = range(1, 251)
reset_index(drop=True)会把筛选后的DataFrame索引重置为0到249,这样range(1,251)就能完美对应每一行,不会出现索引不匹配的问题。
方法二:用rank方法处理同分场景
如果存在多部电影分数相同,想要保证排名唯一(按原表顺序给同分电影分配不同排名),可以用rank方法:
# 1. 按imdb_score降序排名,method='first'保证同分按出现顺序排唯一排名 IMDb_Top_250['rank'] = IMDb_Top_250['imdb_score'].rank(ascending=False, method='first') # 2. 筛选出排名前250的记录(如果原表行数超过250) IMDb_Top_250 = IMDb_Top_250[IMDb_Top_250['rank'] <= 250] # 3. 可选:将rank转为整数(默认rank返回浮点数) IMDb_Top_250['rank'] = IMDb_Top_250['rank'].astype(int)
这个方法更健壮,能处理分数相同的情况,同时保证1到250的排名都是唯一的。
内容的提问来源于stack exchange,提问作者Sourabh Somvanshi
相关产品推荐
相关产品推荐

