2017-01-13 6 views
1

Ich versuche, Zeilenwerte in einer CSV-Datei mit anderen Referenzdateien abzubilden. Die ursprüngliche CSV sieht wie folgt aus:Wörterbuch erzeugt leere Schlüssel/Werte

PROBE,8988,8981,8878,8983 
1371844,0.011,-0.018,-0.032,-0.034 
1386013,0.034,0.225,-0.402,0.418 
1390154,0.145,-0.108,-0.421,-0.048 
1393851,-0.146,-0.026,-0.101,-0.011 

Der Referenz .csv, die ich verwendet, um das Wörterbuch das sieht aus wie zu machen:

PROBE, Title, Gene 
1390154, Cellular, Becn1 
1371844, Liver, Vcp 
1393851, Kidney, Lypla2 
1386013, Heart, Ube2d2 

Idealerweise kann ich das erreichen:

PROBE 8988 8981 8878 8983 
Vcp 0.011 -0.018 -0.032 -0.034 
Ube2d2 0.034 0.225 -0.402 0.418 
Becn1 0.145 -0.108 -0.421 -0.048 
Lypla2 -0.146 -0.026 -0.101 -0.01 

Das habe ich versucht:

import csv 
import pandas as pd 

reader = csv.reader(open('C:\Users\Troy\Documents\ExPSID.csv')) #Open reference .csv file  
result = {} 
for row in reader: 
    key = row[0] 
    result[key] = row[2] 
    dict = result #Configure dictionary 

df = pd.read_csv('C:\Users\Troy\Documents\ExPS2.txt', index_col=0) #Fetch unmapped .csv 
df.replace({"PROBE": dict}) #Use dictionary to map Id's to genes 

Es wirft eine "ValueError: Ersetzung nicht mit überlappenden Schlüsseln und Werten erlaubt".

Ich weiß jedoch, warum dies so ist, weil, wenn ich dict drucken, erhalte ich:

{'': '', ' ': '', '1390154': 'Becn1', '1386013': 'Ube2d2', 'Probe ': 'Gene', '1371844': 'Vcp', '1393851': 'Lypla2'} 

Es prepends mein Wörterbuch mit zwei leeren Schlüssel: Wert-Sets. Wenn ich diese manuell lösche, funktioniert df.replace ({"PROBE": dict}) korrekt und alles ist gut.

Also meine Frage ist, gibt es eine Möglichkeit, dass ich dieses Skript ändern kann, so dass ich nicht manuell den vorangestellten Schlüssel löschen muss: Wert setzt? Gibt es einen besseren Weg, dies insgesamt zu tun?

Ich bin auf Python eindeutig neu, so dass, wenn dies eine dumme Frage werde ich es gerne besitzen: P


PS: Wenn ich wollte auch die Spalten auf der Karte, eine weitere Referenz .csv mit wie folgt:

Experiment, Array, Drug 
8983, Genechip, Famotidine 
8878, Microarray, Dicyclomine 
8988, Genechip, Etidronate 
8981, Microarray, flunarizine 

Kann ich einfach die "Zeile" im oben genannten Code zu "Col" ersetzen? Wenn ich das probierte, spuckte es gerade die ursprüngliche Akte ohne die neuen gemappten Werte zurück.

Ich schätze die Hilfe jedermann!

+2

Ich sehe nichts in Ihrem Code, die magicaly diese „leer“ Schlüssel in der Dictionnary setzen könnte, so meine Vermutung ist, dass Sie ein paar leeren Zeilen in Ihrer CSV-Datei, die dafür verantwortlich sind, haben können. Ich würde vorschlagen, Sie 'print' Zeile [0] und Zeile [2] für jede Zeile zu finden, wo die leeren Werte sind. – jadsq

Antwort

0
import pandas as pd 
    If i understood you correctly you want to achieve something like this from the two sets you have: 

     8988 8981 8878 8983 
PROBE        
Vcp  0.011 -0.018 -0.032 -0.034 
Ube2d2 0.034 0.225 -0.402 0.418 
Becn1 0.145 -0.108 -0.421 -0.048 
Lypla2 -0.146 -0.026 -0.101 -0.011 

pandas merge() function can help you achieve what you want: 

df1 = pd.read_csv('{path_to_original}/org.csv') 
df2 = pd.read_csv('{path_to_reference}/reference.csv', delimiter=', ', engine='python') 
df3 = df1.merge(df2) 
df4 = df3.set_index('Gene').drop(['PROBE', 'Title'], axis=1) 
df4.index.name = 'PROBE' 
print(df4) 

If you take a look at your reference file that has space after delimiter comma i.e why it is mentioned as delimiter ', ' while reading the csv. 
+0

Dies ist perfekt für die Zuordnung des Index. Ich hatte nicht daran gedacht, 'merge' zu ​​verwenden. – TroyPGoff

Verwandte Themen