如何修复'numpy.ndarray'不可调用、'type'对象不可下标TypeError报错
问题根源
- 第一个报错
TypeError: 'numpy.ndarray' object is not callable和DataFrame构造逻辑无关,核心原因是当前脚本的命名空间里,Python内置函数zip被之前的代码覆盖赋值成了一个numpy数组对象。代码执行到zip(email_list, name_list)时,不会调用内置的zip迭代器,反而会尝试把存了numpy数组的zip变量当函数调用,数组本身不可调用,就触发该报错。你在其他项目里同一段代码能正常运行,就是因为那些项目里没有出现用zip当自定义变量名赋值的操作,内置zip函数没有被污染。 - 第二个报错
TypeError: 'type' object is not subscriptable是错误修改导致的:zip作为内置可调用对象,传参必须用圆括号,方括号是下标索引操作,内置的zip类型本身不支持下标取值,自然会报错。
修复方法
- 第一步:清理被污染的命名空间
如果是写.py脚本,全局搜索所有zip =开头的赋值语句,把自定义的zip变量改名为其他不占用内置函数名的名称(比如改成zip_res、zipped_data都可以);如果是用Jupyter Notebook、IPython这类交互环境,直接重启内核,或者执行del zip删除当前环境里自定义的zip变量,把命名空间还给内置zip函数。
可以在执行DataFrame构造代码前先运行校验代码,确认zip已经恢复正常:# 正常输出应为<class 'zip'>,如果输出numpy相关类型说明还没修复 print(type(zip)) - 第二步:恢复最开始写的原始代码即可,不要把zip后面的圆括号改成方括号,原始逻辑本身是正确的:
zlist = pd.DataFrame(list(zip(email_list, name_list)), columns=['email', 'id'])
错误复现示例
可以对照检查自己的代码里是不是有类似的错误写法:
import pandas as pd import numpy as np # !!!这行占用了内置zip的名字,是所有问题的源头 zip = np.array([["a@x.com", 1], ["b@x.com", 2]]) email_list = ["a@x.com", "b@x.com"] name_list = [1, 2] # 执行到这里就会触发numpy.ndarray不可调用的报错 zlist = pd.DataFrame(list(zip(email_list, name_list)), columns=['email', 'id'])
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

