Python &引用;序列对象是可变的,不能散列;错误

Python &引用;序列对象是可变的,不能散列;错误,python,pandas,typeerror,Python,Pandas,Typeerror,我正在尝试让下面的脚本工作。输入文件由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]] d

我正在尝试让下面的脚本工作。输入文件由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
我一直收到一个错误,上面写着:

序列对象是可变的,不能散列

任何帮助都将不胜感激

gene_name = no_headers.iloc[1:,[1]]
这会创建一个数据帧,因为您传递了一个列列表(单个,但仍然是一个列表)。稍后执行此操作时:

gene_name[x]
现在有了一个具有单个值的序列对象。你不能散列这个系列

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

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

简而言之:
gene_name[x]
是一个可变对象,因此不能散列。要将对象用作字典中的键,python需要使用其哈希值,这就是为什么会出现错误

进一步解释:

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

a = 5;
a = 3;
您不会更改
a
的值,而是创建一个新对象并使
a
指向其值

可变对象不能散列。看这个


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

显示完整的回溯,以便我们可以看到抛出错误的行。我猜是
orph\u dict[gene\u name[x]]=0
。回溯还将向我们显示抛出的错误类别。当我拆分为培训和测试数据集时,如何从一开始就应用这种创建序列的技术
X\u-train,X\u-test,y\u-train,y\u-test=train\u-test\u-split(training\u-feature\u-set,training\u-feature\u-label,test\u-size=0.1,random\u-state=42)
@@Alvis如果函数返回数据帧,您仍然可以从中选择单个项。读这本书
.loc
.iloc
可能是您想要的。谢谢@jkitchen我会查看文档:-)