You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中处理含范围的世界排名列转换为float类型时的NameError报错解决

问题解决:处理排名数据时的NameError错误

问题背景

你尝试将世界排名列中的范围格式(如152-200)转换为中间值,编写了处理代码但遇到了NameError,你的代码和报错信息如下:

你的代码

# 更新列名
shanghai_df.rename(columns={'world_rank': 'shanghai_rank'}, inplace=True)
# 将排名范围转换为中间值
def mid_rank(rank_string):
    rank = re.sub('=', '', rank_string)
    rank = rank.split('-')
    s = 0
    for each in rank:
        each = float(each)
        s = s + each
    return s/len(rank)
# 处理上海排名数据中的排名范围
shanghai_df['world_rank_tidy'] = shanghai_df['world_rank'].apply(mid_rank)

报错信息

NameError Traceback (most recent call last)
<ipython-input-1-603ab3ae72de> in <module>
10 
11 # replace ranking range for shanghai data
---> 12 shanghai_df['world_rank_tidy'] = shanghai_df['shanghai_rank'].apply(mid_rank)
/usr/lib/python3.9/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwargs)
4354 dtype: float64
4355 """
-> 4356 return SeriesApply(self, func, convert_dtype, args, kwargs).apply()
4357 
4358 def _reduce(
/usr/lib/python3.9/site-packages/pandas/core/apply.py in apply(self)
1034 return self.apply_str()
1035 
-> 1036 return self.apply_standard()
1037 
1038 def agg(self):
/usr/lib/python3.9/site-packages/pandas/core/apply.py in apply_standard(self)
1090 # List[Union[Callable[..., Any], str]]]]]"; expected
1091 # "Callable[[Any], Any]"
-> 1092 mapped = lib.map_infer(
1093 values,
1094 f, # type: ignore[arg-type]
/usr/lib/python3.9/site-packages/pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()
<ipython-input-1-603ab3ae72de> in mid_rank(rank_string)
1 #Merge the data
2 def mid_rank(rank_string):
----> 3 rank = re.sub('=', '', rank_string)
4 rank = rank.split('-')
5 s = 0
NameError: name 're' is not defined

报错原因分析

这个错误很明确:你在代码中使用了re.sub()函数,但没有导入Python的正则表达式模块re,Python解释器不知道re是什么,所以抛出了NameError。

另外还有一个小问题:你先把world_rank列重命名为shanghai_rank,但后面调用apply时又用了shanghai_df['world_rank'],这会导致找不到列的错误(虽然这次先触发了NameError),需要统一列名。

修复方案

1. 导入re模块

在代码的最开头添加导入语句:

import re
import pandas as pd  # 假设你也需要导入pandas,没看到的话也要加上

2. 修正列名不一致的问题

要么使用重命名后的列名shanghai_rank,要么去掉重命名的代码(如果不需要的话)。这里我们选择保留重命名,统一使用shanghai_rank:

修正后的完整代码

import re
import pandas as pd

# 假设你已经读取了数据到shanghai_df,比如:
# shanghai_df = pd.read_csv('你的数据文件路径')

# 更新列名
shanghai_df.rename(columns={'world_rank': 'shanghai_rank'}, inplace=True)

# 将排名范围转换为中间值
def mid_rank(rank_string):
    # 去掉字符串中的=号,转成str防止非字符串类型报错
    rank_clean = re.sub('=', '', str(rank_string))
    # 拆分范围
    rank_parts = rank_clean.split('-')
    # 计算平均值
    total = sum(float(part) for part in rank_parts)
    return total / len(rank_parts)

# 处理排名数据
shanghai_df['world_rank_tidy'] = shanghai_df['shanghai_rank'].apply(mid_rank)

额外优化:处理异常情况

如果数据中存在无法转换为数字的异常值(比如NR表示未排名),可以给函数加上异常处理,避免代码崩溃:

def mid_rank(rank_string):
    try:
        rank_clean = re.sub('=', '', str(rank_string))
        rank_parts = rank_clean.split('-')
        total = sum(float(part) for part in rank_parts)
        return total / len(rank_parts)
    except (ValueError, TypeError):
        # 遇到无法转换的情况返回NaN,方便后续处理
        return pd.NA

内容的提问来源于stack exchange,提问作者SQL Learner 1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:42:30