2016-05-13 11 views
1

Ich versuche, eine Tabelle aus einer größeren .txt Datei in Python zu lesen.Spalten mit pandas.read_csv trennen

Ein Auszug der Daten ist:

2 Network magnitudes: 
    MLv  2.05 +/- 1.34 7    
    M   2.05   7 preferred 

7 Phase arrivals: 
    sta net dist azi phase time   res  wt sta 
    BMOR EC 0.0 226 P  00:22:31.385 -0.6 M 1.0 BMOR 
    BREF EC 0.0 347 P  00:22:31.543 -0.5 M 1.0 BREF 
    BTAM EC 0.0 58 P  00:22:31.796 -0.3 M 1.0 BTAM 
    BVC2 EC 0.0 26 P  00:22:33.061 0.8 M 1.0 BVC2 
    BNAS EC 0.1 294 P  00:22:32.871 -0.1 M 1.0 BNAS 
    SUCR EC 0.1 314 P  00:22:34.610 0.6 M 1.0 SUCR 
    BRRN EC 0.1 207 P  00:22:34.768 0.4 M 1.0 BRRN 

7 Station magnitudes: 
    sta net dist azi type value res  amp per 
    BMOR EC 0.0 226 MLv  1.48 -0.57 1.20076  

ich die Phase Ankünften Tabelle nur wollen und so np.loadtext und np.genfromtxt beide fallen kurz aus verschiedenen Gründen (kann einen bug nicht beschäftigen sich mit Zahlen und Strings/enthält, es sei denn geben Sie nur ein Leerzeichen (‘‚) Begrenzungszeichen, die ich hier nicht tun können)

ich habe mit dem pandas.read_csv fucntion versucht, aber es ist nicht zu erkennen die Begrenzer

a = pd.read_csv(datafileloc, sep='\+s', skiprows=5, skipfooter=3) 

produziert:

a 
Out[90]: 
    sta net dist azi phase time   res  wt sta 
0 BMOR EC 0.0 226 P  00:22:31.385 -0....  
1 BREF EC 0.0 347 P  00:22:31.543 -0....  
2 BTAM EC 0.0 58 P  00:22:31.796 -0....  
3 BVC2 EC 0.0 26 P  00:22:33.061 0....  
4 BNAS EC 0.1 294 P  00:22:32.871 -0....  
5 SUCR EC 0.1 314 P  00:22:34.610 0....  
6 BRRN EC 0.1 207 P  00:22:34.768 0.... 

, die von gut auseinander sieht, dass sie jeweils eine Saite sind, und es hat nicht die Aufmerksamkeit auf den weißen Raum delimiters bezahlt:

a.values 
Out[89]: 
array([['BMOR EC 0.0 226 P  00:22:31.385 -0.6 M 1.0 BMOR'], 
     ['BREF EC 0.0 347 P  00:22:31.543 -0.5 M 1.0 BREF'], 
     ['BTAM EC 0.0 58 P  00:22:31.796 -0.3 M 1.0 BTAM'], 
     ['BVC2 EC 0.0 26 P  00:22:33.061 0.8 M 1.0 BVC2'], 
     ['BNAS EC 0.1 294 P  00:22:32.871 -0.1 M 1.0 BNAS'], 
     ['SUCR EC 0.1 314 P  00:22:34.610 0.6 M 1.0 SUCR'], 
     ['BRRN EC 0.1 207 P  00:22:34.768 0.4 M 1.0 BRRN']], dtype=object) 

Linien mit getrennt werden können list(a.values[0])[0].split(), aber das wird dann reorganisieren, um einzelne Spalten zu erhalten. Ich möchte pandas.read_csv nur erkennen, dass sie getrennt sind, so dass ich einzelne Spalten extrahieren kann (ziemlich effizient sein wird wichtig sein, sobald ich es skalieren)

Wo gehe ich falsch?

+1

Ich bin nicht sicher, ob Sie dies als Tippfehler schließen (Sie brauchen '\ s +', nicht '\ + s') oder als ein Duplikat von [this] (http://stackoverflow.com/questions/15026698/how-to-make-separator-in-lesen-csv-flexibler-wrt-whitespace). – DSM

+0

Hey @DSM - Danke! Ich habe es gerade getestet und du hast recht, es ist ein Tippfehler. Allerdings habe ich es direkt aus der Dokumentation genommen, der Tippfehler kommt von dort: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html (unter delim_whitespace-Parameter) – mjp

+0

hast du recht! Ich werde dafür sorgen, dass das behoben wird. :-) – DSM

Antwort

2

Wie DSM wies darauf hin, ist es ein Tippfehler im Begrenzer:

\s+, nicht \+s

, die in the documentation von einem Tippfehler kam, unter der delim_whitespace Parameter Überschrift.

+1

Für den Datensatz wurde dies in Stamm mit [c9ffd78] (https://github.com/pydata/pandas/commit/c9ffd7891dadd6e5590695e142f77a3476b5c4e3) behoben. – DSM

Verwandte Themen