Python TypeError报错:不支持'Table'与'float'执行减法运算
解决计算IMDB电影平均评分时的TypeError问题
嘿,我来帮你搞定这个错误!咱们先拆解一下问题出在哪,再给你修正后的代码。
错误根源分析
你遇到的TypeError: unsupported operand type(s) for -: 'Table' and 'float',本质原因是你传给np.average()的不是数值数组,而是一个Table对象:
table_20th.select("Rating")返回的是一个单列表格(仍然是Table类型),而不是直接的评分数值集合。- 当numpy尝试对这个Table对象计算均值时,内部会执行数值运算(比如每个元素减去均值),但Table和浮点数无法做减法,于是触发了错误。
修正后的代码方案
你完全不需要先调用select(),直接从过滤后的Table中提取Rating列的数值数组即可。假设你用的是datascience库的Table(常见于伯克利CS10课程),它的column()方法会直接返回numpy可处理的数组:
import numpy as np # 过滤20世纪(1900-1999年)的电影 table_20th = imdb.where("Year", are.below(2000)) # 直接提取Rating列的数值数组 ratings_20th = table_20th.column("Rating") # 计算平均评分 average_20th_century_rating = np.average(ratings_20th) # 21世纪(2000年及以后)的电影同理 table_21th = imdb.where("Year", are.above_or_equal_to(2000)) ratings_21th = table_21th.column("Rating") average_21th_century_rating = np.average(ratings_21th) # 打印结果 print(f"20世纪电影平均评分:{average_20th_century_rating:.2f}") print(f"21世纪电影平均评分:{average_21th_century_rating:.2f}")
额外说明
如果你确实想保留select()步骤(虽然没必要),也可以从单列表格中提取数组:
# 先得到单列表格 rating_20th_table = table_20th.select("Rating") # 再提取数组(用列名或索引都可以) ratings_20th = rating_20th_table.column("Rating") # 或者 ratings_20th = rating_20th_table.column(0)
另外,如果你发现column()返回的不是numpy数组,可以手动转换:
ratings_20th = np.array(table_20th.column("Rating"))
内容的提问来源于stack exchange,提问作者JuliusCaesar
相关产品推荐
相关产品推荐

