2016-05-21 8 views
3

Ich muss meine Daten für eine Genetik-Software neu formatieren, die jede Spalte in zwei geteilt werden muss, z. B. 0-> G G; 1-> A G; 2 -> A A;. Die Ausgabedatei soll tabulatorgetrennt sein. Ich versuche, es in Pandas zu tun:Pandas: schreiben Tab-getrennte Datenrahmen mit Literal-Tabs ohne Anführungszeichen

import csv 
import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randint(0,3, size = (10,5)), 
        columns=[ chr(c) for c in range(97, 97+5) ]) 

def fake_alleles(x): 
    if x==0: 
     return "A\tA" 
    if x==1: 
     return "A\tG" 
    if x==2: 
     return "G\tG" 

plinkpast6 = df.applymap(fake_alleles) 
plinkpast6.to_csv("test.ped", sep="\t", quoting=csv.QUOTE_NONE) 

Was ist mir ein Fehler Error: need to escape, but no escapechar set. Gibt es andere Möglichkeiten, es mit pandas zu tun?

Antwort

6

sep="\t" versucht, jedes Element der Datenframezeile zu nehmen und dazwischen einen "\t" einzufügen. Problem ist, dass es "\t" in den Elementen gibt und es verwirrt es. Es möchte, dass Sie die "\t" s in den Elementen entkommen und Sie nicht haben. Ich vermute, du willst, dass deine endgültige Ausgabe 6 Spalten hat.

Versuchen Sie folgendes:

import csv 
import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randint(0,3, size = (10,20))) 

def fake_alleles(x): 
    if x==0: 
     return "A\tA" 
    if x==1: 
     return "A\tG" 
    if x==2: 
     return "G\tG" 

plinkpast6 = df.iloc[:,:3].applymap(fake_alleles) 
plinkpast6 = plinkpast6.stack().str.split('\t', expand=True).unstack() 
plinkpast6.to_csv("test.ped", sep="\t", quoting=csv.QUOTE_NONE) 
+0

Anzahl der Spalten ist nicht begrenzt. Ihre Vorgehensweise hat fast für mich funktioniert, außer dass die Teile jeder ursprünglichen Spalte jetzt zwischen der linken und der rechten Hälfte der Matrix verteilt sind und ich sie sammeln musste, indem ich '.swaplevel (0,1, axis = 1) .sort_index (axis = 1) '. Sieht immer noch wie ein hacky Weg aus, um die Pandas auszutricksen. –