2016-07-25 9 views
2

Die Folge sind zwei Reihen von meinem unmarkierten-Datensatz, eine kleine Untergruppe:Wie man beschriftete Werte von Spalten in einen Pandas-Datenrahmen parst (einige Spaltenwerte fehlen)?

random1 147 sub1 95 34 dewdfa3 15000 -1238 SBAASBAQSBARSBATSBAUSBAXBELAAX AAA:COL:UVTWUVWDUWDUWDWW BBB:COL:F CCC:COL:GTATGTCA DDD:COL:K20 EEE:COL:54T GGG:COL:-30.5 HHH:COL:000.1 III:COL:2 JJJ:COL:0 

random2 123 sub1 996 12 kwnc239 10027 144  LBPRLBPSLBRDLBSDLBSLLBWB AAA:COL:UWTTUTUVVUWWUUU BBB:COL:F DDD:COL:CACGTCGG EEE:COL:K19 FFF:COL:HCC16 GGG:COL:873 III:COL:-77 JJJ:COL:0 KKK:COL:0 LLL:COL:1 MMM:COL:212 

Die ersten neun Spalten sind in der gesamten Datenmenge konsistent und beschriftet werden.

Mein Problem ist mit den folgenden Spalten. Jeder Wert in dieser Zeile wird dann zuerst mit dem Spaltenwert, z.B. AAA:COL:UVTWUVWDUWDUWDWW ist Spalte AAA, BBB:COL:F Spalte BBB usw.

jedoch (1) jede Reihe nicht über die gleiche Anzahl von Spalten und (2) einige Spalten „fehlende“ sind. Die erste Zeile fehlt Spalte FFF, die zweite Zeile überspringt Spalte CCC und .

Beachten Sie auch, dass die erste Zeile bei Spalte JJJ stoppt, während die zweite Spalte bei Spalte MMM stoppt.

Wie würde man 9 + 13 Spalten eines Datenrahmens zuordnen und diese Werte so analysieren, dass, wenn ein column:value Paar nicht existiert, diese Spalte einen NaN Wert hätte.

Würde so etwas wie pandas.read_table() die Funktionalität dafür haben?

Dies ist die "richtige" Format für die erste Reihe:

random int  sub int2 int3 string1 int4 int5 string2       AAA   BBB CCC DDD EEE FFF GGG .... MMM 
random1 147 sub1 95  34  dewdfa3 15000 -1238 SBAASBAQSBARSBATSBAUSBAXBELAAX UVTWUVWDUWDUWDWW F DFADFADFA K20 54T 'NaN' -30.5 ....'NaN' 

Verwandte (und offen) Frage hier: How to import unlabeled and missing columns into a pandas dataframe?

+0

Ich sehe ein "III: A: 2". Erkläre, was das ist. – piRSquared

+0

@piRSquared Spalte I (d. H. Großbuchstabe "i"), kommt nach Spalte H und vor Spalte J – ShanZhengYang

+0

Was ich meinte war, dass "III: A: 2" inkonsistent ist. Jeder andere Eintrag hat ein '': COL:' 'darin, außer' 'III: A: 2'' und' 'HHH: B: 000.1''. Sie haben in Ihrem Beitrag nicht erklärt, wie diese interpretiert werden sollten. – piRSquared

Antwort

1

Dies wird es tun:

text = """random1 147 sub1 95 34 dewdfa3 15000 -1238 SBAASBAQSBARSBATSBAUSBAXBELAAX AAA:COL:UVTWUVWDUWDUWDWW BBB:COL:F CCC:COL:GTATGTCA DDD:COL:K20 EEE:COL:54T GGG:COL:-30.5 HHH:COL:000.1 III:COL:2 JJJ:COL:0 
random2 123 sub1 996 12 kwnc239 10027 144  LBPRLBPSLBRDLBSDLBSLLBWB AAA:COL:UWTTUTUVVUWWUUU BBB:COL:F DDD:COL:CACGTCGG EEE:COL:K19 FFF:COL:HCC16 GGG:COL:873 III:COL:-77 JJJ:COL:0 KKK:COL:0 LLL:COL:1 MMM:COL:212""" 

data = [line.split() for line in text.split('\n')] 
data1 = [line[:9] for line in data] 
data2 = [line[9:] for line in data] 

# list of dictionaries from data2, where I parse the columns 
dict2 = [[dict([d.split(':COL:') for d in d1]) for d1 in data2] 

result = pd.concat([pd.DataFrame(data1), 
        pd.DataFrame(dict2)], 
        axis=1) 

result.iloc[:, 9:] 

enter image description here

+0

Oben, ich habe nur zwei Zeilen enthalten. In Wirklichkeit gibt es Tausende von Zeilen. Könnten Sie das obige bearbeiten, um zwischen Zeilen zu analysieren? – ShanZhengYang

+0

Ich zeigte es so, um alle Daten zu zeigen. Ich hatte transponiert. Anscheinend war das keine gute Idee. 'Ergebnis' ist deine Antwort. 'result.iloc [:, 9:]' dient nur dazu, die herausfordernden Spalten zu zeigen, damit ich sie ausdrucken kann. – piRSquared

+0

Entschuldigung, ich habe die zweite Codezeile missverstanden. Danke, ich bin mir nicht sicher warum ich vorher verwirrt war. – ShanZhengYang