我正在尝试让下面的脚本工作。输入文件由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我一直有个错误说:
系列对象是可变的,不能进行散列处理。
任何帮助都将不胜感激!
发布于 2015-04-17 14:42:31
简单地说:gene_name[x]是一个可变的对象,因此不能对其进行散列。要将对象作为字典中的键使用,python需要使用它的散列值,这就是获得错误的原因。
进一步解释:
可变对象是可以更改值的对象。例如,list是一个可变对象,因为您可以附加到它。int是一个不可变的对象,因为您无法更改它。当你这样做时:
a = 5;
a = 3;如果不更改a的值,则创建一个新对象并使a指向其值。
不能对可变对象进行散列。看这个answer。
要解决问题,您应该在字典中使用不可变对象作为键。例如:tuple,string,int。
发布于 2015-04-17 14:36:25
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来增加计数器。
https://stackoverflow.com/questions/29700552
复制相似问题