我正在尝试使用以下脚本。输入文件由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
我不断收到错误消息:
系列对象是可变的,无法进行散列
任何帮助都会非常感激!
答案 0 :(得分:16)
很快:gene_name[x]
是一个可变对象,因此无法进行哈希处理。要将对象用作字典中的键,python需要使用其哈希值,这就是您收到错误的原因。
进一步解释:
可变对象是可以更改值的对象。
例如,list
是一个可变对象,因为您可以附加到它。 int
是一个不可变对象,因为您无法更改它。当你这样做时:
a = 5;
a = 3;
您没有更改a
的值,您创建了一个新对象,并使a
指向其值。
无法对可变对象进行哈希处理。请参阅此answer。
要解决您的问题,您应该使用不可变对象作为字典中的键。例如:tuple
,string
,int
。
答案 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
增加计数器。