首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“系列对象是可变的,不能散列”错误。

“系列对象是可变的,不能散列”错误。
EN

Stack Overflow用户
提问于 2015-04-17 13:26:22
回答 2查看 261.4K关注 0票数 70

我正在尝试让下面的脚本工作。输入文件由3列组成:基因关联类型、基因名称和疾病名称。

代码语言:javascript
复制
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

我一直有个错误说:

系列对象是可变的,不能进行散列处理。

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2015-04-17 14:42:31

简单地说:gene_name[x]是一个可变的对象,因此不能对其进行散列。要将对象作为字典中的键使用,python需要使用它的散列值,这就是获得错误的原因。

进一步解释:

可变对象是可以更改值的对象。例如,list是一个可变对象,因为您可以附加到它。int是一个不可变的对象,因为您无法更改它。当你这样做时:

代码语言:javascript
复制
a = 5;
a = 3;

如果不更改a的值,则创建一个新对象并使a指向其值。

不能对可变对象进行散列。看这个answer

要解决问题,您应该在字典中使用不可变对象作为键。例如:tuplestringint

票数 38
EN

Stack Overflow用户

发布于 2015-04-17 14:36:25

代码语言:javascript
复制
gene_name = no_headers.iloc[1:,[1]]

这会创建一个DataFrame,因为您传递了一个列列表(单个,但仍然是一个列表)。当您稍后执行此操作时:

代码语言:javascript
复制
gene_name[x]

现在有一个具有单个值的Series对象。你不能把系列赛搞砸。

解决方案是从一开始就创建系列。

代码语言:javascript
复制
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来增加计数器。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29700552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档