2017-02-19 6 views
1

Frage:wiederholen Python-Befehl auf mehrere Spalten

Wie kann ich den gleichen Python-Code, um mehrere Datenspalten anzuwenden.

Datenformat:

Ich lerne gerade Python, und ich habe ein Skript geschrieben, um meine Daten umformatieren. Mein aktuelles Format beginnt mit 4 beschreibenden Spalten von vielen Datenspalten gefolgt (zB 1/1)

#CHROM POS REF ALT IND_1 IND_2 IND_3 IND_4 
2L 6631 A G 1/1 0/0 0/0 0/0 
2L 6633 T C 0/0 1/0 0/0 0/0 
2L 6637 C G 1/1 0/0 0/0 0/0 

Ich versuche, die 0 und 1 zu den Werten in der REF und ALT Spalten zu ändern, das jeweils mit der gewünschte Endformat aussehen:

2L 6631 A G G/G A/A A/A A/A 
2L 6633 T C T/T C/T T/T T/T 
2L 6637 C G G/G C/C C/C C/C 

Was ich habe, so weit:

ich ein Skript geschrieben haben, dass dies für eine einzelne Spalte tun, aber ich habe mehr als 100 Spalten von Daten, damit ich fragte sich, ob es einen Weg zu einem gibt ply dieses Skript zu mehreren Spalten, anstatt es für jedes spezifisch zu schreiben.

for line in openfile: 
    ## skip header 
    if line.startswith("#CHROM"): 
     continue 
    columns = line.rstrip().split("\t") 
    CHROM = columns[0] 
    POS = columns[1] 
    REF = columns[2] 
    ALT = columns[3] 
    ALLELES1 = columns[4].replace("0",REF).replace("1",ALT).replace(".","0") 
    ALLELES2 = columns[5].replace("0",REF).replace("1",ALT).replace(".","0") 
    print CHROM, POS, REF, ALT, ALLELES1, ALLELES2 
+1

Lesen Sie über Funktionen. Ich denke, sie machen was du willst. – tburrows13

+0

Danke für den Vorschlag! – user4670961

Antwort

1

Ich würde vorschlagen, die Umsetzung dieses eine Liste Verständnis mit:

for line in f.readlines(): 
    ## skip header 
    if line.startswith("#CHROM"): 
     continue 
    columns = line.rstrip().split("\t") 
    REF, ALT = columns[2:4] 
    modified = [c.replace("0", REF).replace("1", ALT).replace(".", "0") 
       for c in columns[4:]] 
    print('\t'.join(columns[0:4] + modified)) 

Drei Ergänzungen Code:

REF, ALT = columns[2:4] 

, die eine saubere Art und Weise zwei Elemente aus der Liste zu greifen.

modified = [c.replace("0", REF).replace("1", ALT).replace(".", "0") 
      for c in columns[4:]] 

Das ist ein Listenverständnis, um die Ersetzung über alle Felder gleichzeitig durchzuführen. Und dann

print('\t'.join(columns[0:4] + modified)) 

, die alles auf einmal zusammensetzt.

+0

Vielen Dank für eine solche klare Erklärung. Der Code funktioniert perfekt und die Beschreibung macht deutlich, was jedes Teil tut, damit es in Zukunft selbst angepasst und implementiert werden kann. – user4670961

2

Hier ist meine Lösung:

def read_data(filename): 
    with open(filename, "r") as file_handle: 
     for line in file_handle: 
      # skip header 
      if line.startswith("#CHROM"): 
       continue 
      columns = line.rstrip().split("\t") 
      CHROM = columns[0] 
      POS = columns[1] 
      REF = columns[2] 
      ALT = columns[3] 
      ALLELS = [value.replace("0", REF).replace("1", ALT).replace(".", "0") for value in columns[4:]] 
      print("\t".join(columns[0:4] + ALLELS)) 

Sie es so nennen:

read_data("file.txt") 

[value.replace("0", REF).replace("1", ALT).replace(".", "0") for value in columns[4:]] ist eine "Liste Verständnis" bezeichnet. Es betrachtet jeden Wert einer Liste und macht etwas damit. Siehe Documentation.

columns[4:] bedeutet, schauen Sie sich alle meine Spalten an und holen Sie mir die Spalten ab Index 4 bis zur letzten Spalte.

sep="\t" in der print Anweisung bedeutet, dass alle Elemente, die Sie an die Druckfunktion übergeben, mit einem TAB dazwischen gedruckt werden sollen.

"\t".join(columns[0:4] + ALLELS) gibt eine einzelne Zeichenfolge zurück, in der alle Elemente durch ein TAB verknüpft sind. Siehe Stephen Rauch.