Python &引用;序列对象是可变的,不能散列;错误
我正在尝试让下面的脚本工作。输入文件由3列组成:基因关联类型、基因名称和疾病名称Python &引用;序列对象是可变的,不能散列;错误,python,pandas,typeerror,Python,Pandas,Typeerror,我正在尝试让下面的脚本工作。输入文件由3列组成:基因关联类型、基因名称和疾病名称 cols = ['Gene type', 'Gene name', 'Disorder name'] no_headers = pd.read_csv('orphanet_infoneeded.csv', sep=',',header=None,names=cols) gene_type = no_headers.iloc[1:,[0]] gene_name = no_headers.iloc[1:,[1]] d
cols = ['Gene type', 'Gene name', 'Disorder name']
no_headers = pd.read_csv('orphanet_infoneeded.csv', sep=',',header=None,names=cols)
gene_type = no_headers.iloc[1:,[0]]
gene_name = no_headers.iloc[1:,[1]]
disease_name = no_headers.iloc[1:,[2]]
query = 'Disease-causing germline mutation(s) in' ###add query as required
orph_dict = {}
for x in gene_name:
if gene_name[x] in orph_dict:
if gene_type[x] == query:
orph_dict[gene_name[x]]=+ 1
else:
pass
else:
orph_dict[gene_name[x]] = 0
我一直收到一个错误,上面写着:
序列对象是可变的,不能散列
任何帮助都将不胜感激
gene_name = no_headers.iloc[1:,[1]]
这会创建一个数据帧,因为您传递了一个列列表(单个,但仍然是一个列表)。稍后执行此操作时:
gene_name[x]
现在有了一个具有单个值的序列对象。你不能散列这个系列
解决方案是从一开始就创建系列
gene_type = no_headers.iloc[1:,0]
gene_name = no_headers.iloc[1:,1]
disease_name = no_headers.iloc[1:,2]
另外,如果你有
orph_dict[gene_name[x]]=+1
,我猜这是一个输入错误,你真正的意思是orph_dict[gene_name[x]+=1
来增加计数器。简而言之:gene_name[x]
是一个可变对象,因此不能散列。要将对象用作字典中的键,python需要使用其哈希值,这就是为什么会出现错误
进一步解释:
可变对象是值可以更改的对象。
例如,list
是一个可变对象,因为您可以附加到它int
是一个不可变的对象,因为您无法更改它。当您这样做时:
a = 5;
a = 3;
您不会更改a
的值,而是创建一个新对象并使a
指向其值
可变对象不能散列。看这个
要解决您的问题,您应该使用不可变对象作为字典中的键。例如:
tuple
、string
、int
显示完整的回溯,以便我们可以看到抛出错误的行。我猜是orph\u dict[gene\u name[x]]=0
。回溯还将向我们显示抛出的错误类别。当我拆分为培训和测试数据集时,如何从一开始就应用这种创建序列的技术X\u-train,X\u-test,y\u-train,y\u-test=train\u-test\u-split(training\u-feature\u-set,training\u-feature\u-label,test\u-size=0.1,random\u-state=42)
@@Alvis如果函数返回数据帧,您仍然可以从中选择单个项。读这本书.loc
或.iloc
可能是您想要的。谢谢@jkitchen我会查看文档:-)