我试图让以下脚本工作.输入文件由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
.
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
要增加柜台.