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

时间:2015-04-17 13:26:22

标签: python

我正在尝试使用以下脚本。输入文件由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]]
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

我不断收到错误消息:

  

系列对象是可变的,无法进行散列

任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:16)

很快:gene_name[x]是一个可变对象,因此无法进行哈希处理。要将对象用作字典中的键,python需要使用其哈希值,这就是您收到错误的原因。

进一步解释:

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

a = 5;
a = 3;

您没有更改a的值,您创建了一个新对象,并使a指向其值。

无法对可变对象进行哈希处理。请参阅此answer

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

答案 1 :(得分:6)

gene_name = no_headers.iloc[1:,[1]]

这会创建一个DataFrame,因为您传递了一列列(单个列,但仍然是列表)。当你稍后这样做时:

gene_name[x]

您现在拥有一个具有单个值的Series对象。你不能散列系列。

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

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增加计数器。