2015-04-17 5 views
9

Ich versuche, das folgende Skript zu erhalten. Die Eingabedatei besteht aus 3 Spalten: Genverknüpfungstyp, Genname und Krankheitsname."Serienobjekte sind änderbar und können nicht gehashed werden" Fehler

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 

ich immer einen Fehler bekommen, die sagt:

Serie Objekte wandelbar sind und nicht

Jede Hilfe teuer würde geschätzt gehasht werden kann!

+1

zeigen Sie uns die vollständige Traceback, damit wir die Zeile sehen können, auf die der Fehler geworfen wird. Ich vermute, es ist 'orph_dict [gen_name [x]] = 0'. das Traceback würde uns auch die Klasse des Fehlers zeigen, der geworfen wird. – dbliss

Antwort

3

Dies erstellt einen DataFrame, weil Sie eine Liste von Spalten (einzeln, aber immer noch eine Liste) übergeben. Wenn Sie das später tun:

haben Sie jetzt ein Series-Objekt mit einem einzelnen Wert. Sie können die Serie nicht hashen.

Die Lösung besteht darin, eine Serie von Anfang an zu erstellen.

gene_type = no_headers.iloc[1:,0] 
gene_name = no_headers.iloc[1:,1] 
disease_name = no_headers.iloc[1:,2] 

Auch dort, wo Sie orph_dict[gene_name[x]] =+ 1 haben, vermute ich, dass ein Tippfehler ist und Sie wirklich orph_dict[gene_name[x]] += 1 bedeuten den Zähler zu erhöhen.

+0

Wie kann ich diese Technik anwenden, um die Serie von Anfang an zu erstellen, wenn ich mich in einen Trainings- und Testdatensatz aufteile? 'X_train, X_test, y_train, y_test = train_test_split (training_feature_set, training_feature_label, test_size = 0,1, random_state = 42)' @http: //stackoverflow.com/users/639792/jkitchen – Alvis

+0

@Alvis, wenn Ihre Funktion Datenrahmen gibt, Sie können immer noch einzelne Artikel aus diesen auswählen. Lesen Sie die [Dokumente zur Indexierung] (http://pandas.pydata.org/pandas-docs/stable/indexing.html). '.loc' oder' .iloc' sind wahrscheinlich, was Sie wollen. – jkitchen

+0

Danke @jkitchen Ich überprüfe die Dokumentation :-) – Alvis

10

Kurz: gene_name[x] ist ein veränderbares Objekt, so dass es nicht gehashed werden kann. Um ein Objekt als Schlüssel in einem Wörterbuch zu verwenden, muss Python seinen Hash-Wert verwenden, und deshalb erhalten Sie einen Fehler.

Weitere Erläuterungen:

veränderbare Objekte sind Objekte, die Wert geändert werden kann. Zum Beispiel ist list ein veränderbares Objekt, da Sie es anhängen können. int ist ein unveränderliches Objekt, weil Sie es nicht ändern können. Wenn Sie das tun:

a = 5; 
a = 3; 

Sie sich nicht ändern den Wert von a, erstellen Sie ein neues Objekt und a Punkt, um seinen Wert machen.

Veränderbare Objekte können nicht gehashed werden. Siehe hierzu answer.

Um Ihr Problem zu lösen, sollten Sie unveränderliche Objekte als Schlüssel in Ihrem Wörterbuch verwenden. Zum Beispiel: tuple, string, int.

Verwandte Themen