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

Sal*_*Sal 43 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
Run Code Online (Sandbox Code Playgroud)

我一直收到错误消息:

系列对象是可变的,不能进行哈希处理

任何帮助将非常感谢!

Ell*_*ski 22

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

进一步说明:

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

a = 5;
a = 3;
Run Code Online (Sandbox Code Playgroud)

您不要更改值a,创建新对象并a指向其值.

可变对象无法进行哈希处理.看到这个答案.

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


jki*_*hen 6

gene_name = no_headers.iloc[1:,[1]]
Run Code Online (Sandbox Code Playgroud)

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

gene_name[x]
Run Code Online (Sandbox Code Playgroud)

你现在有一个具有单个值的Series对象.你不能哈希系列.

解决方案是从一开始就创建Series.

gene_type = no_headers.iloc[1:,0]
gene_name = no_headers.iloc[1:,1]
disease_name = no_headers.iloc[1:,2]
Run Code Online (Sandbox Code Playgroud)

而且,你在哪里orph_dict[gene_name[x]] =+ 1,我猜这是一个错字,你真的是orph_dict[gene_name[x]] += 1要增加柜台.