Jupyter Notebook本地报错TypeError,办公电脑正常求解决方法
解决TypeError: 'float' object is not subscriptable问题
错误原因
你的代码里用x[1:]默认Value列所有值都是带$符号的字符串,但个人电脑上该列存在float类型的值(比如空值NaN或直接存储的浮点数),对float做下标访问就会触发这个错误。
两台电脑表现不同,大概率是pandas版本差异导致的:不同版本的pandas读取CSV时,对混合类型列的推断逻辑不一样——办公电脑的pandas把Value列全识别为字符串,而个人电脑的pandas自动把部分值转成了float。
修复方案
无需更新系统,调整代码即可兼容两种场景:
方案1:自定义处理函数(更灵活)
import pandas as pd pd.set_option('display.max_colwidth', None) jeopardy = pd.read_csv('jeopardy.csv') jeopardy.rename(columns=lambda x: x.strip(), inplace=True) print(jeopardy.head()) def convert_to_float(x): # 先统一转成字符串,避免float类型报错 x_str = str(x).strip() if x_str.startswith('$'): return float(x_str[1:].replace(',', '')) # 处理非$开头的情况(比如空值、纯数字) try: return float(x_str) except: return None jeopardy["Value_float"] = jeopardy['Value'].apply(convert_to_float)
方案2:pandas字符串方法链式处理(更简洁)
利用pandas的str方法自动跳过非字符串值:
import pandas as pd pd.set_option('display.max_colwidth', None) jeopardy = pd.read_csv('jeopardy.csv') jeopardy.rename(columns=lambda x: x.strip(), inplace=True) print(jeopardy.head()) jeopardy["Value_float"] = jeopardy['Value'].astype(str).str[1:].str.replace(',', '').astype(float)
验证建议
在个人电脑上运行以下代码,确认Value列的实际类型:
print(jeopardy['Value'].dtype) print(jeopardy['Value'].apply(type).unique())
可以直接看到该列是否存在float类型元素,精准定位问题。
内容的提问来源于stack exchange,提问作者user23059245
相关产品推荐
相关产品推荐

