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
相关产品推荐
相关产品推荐

