2017-05-22 6 views
2

ich eine Datei mit der folgenden Struktur (erste Zeile ist der Header, Dateiname wird test.dat):Pandas read_csv Separator in letzten Spalt ignorieren

ID_OBS   LAT  LON  ALT TP TO LT_min LT_max STATIONNAME 
ALT_NOA_000 82.45 -62.52 210.0 FM 0 0.0 24.0 Alert, Nunavut, Canada 

Wie anweisen ich Pandas die gesamten Sendernamen zu lesen (in dieses Beispiel, Alert, Nunavut, Kanada) als einzelnes Element? Ich verwende delim_whitespace=True in meinem Code, aber das funktioniert nicht, da der Stationsname Leerzeichen enthält.

Running:

import pandas as pd 
test = pd.read_csv('./test.dat', delim_whitespace=True, header=1) 
print(test.to_string()) 

Produziert:

    ID_OBS LAT LON ALT TP TO LT_min LT_max STATIONNAME 
ALT_NOA_000 82.45 -62.52 210.0 FM 0 0.0 24.0 Alert, Nunavut,  Canada 

schnell durch die Tutorials Lesen nicht helfen. Was fehlt mir hier?

Antwort

1

Ich nähere mich oft diesen, indem ich meinen eigenen kleinen Parser schreibe. Im Allgemeinen gibt es Möglichkeiten, Pandas zu Ihrem Willen zu beugen, aber ich finde diese Art und Weise ist oft einfacher:

Code:

import re 

def parse_my_file(filename): 
    with open(filename) as f: 
     for line in f: 
      yield re.split(r'\s+', line.strip(), 8) 

# build the generator   
my_parser = parse_my_file('test.dat') 

# first element returned is the columns 
columns = next(my_parser) 

# build the data frame 
df = pd.DataFrame(my_parser, columns=columns) 
print(df) 

Ergebnisse:

 ID_OBS LAT  LON ALT TP TO LT_min LT_max \ 
0 ALT_NOA_000 82.45 -62.52 210.0 FM 0 0.0 24.0 

       STATIONNAME 
0 Alert, Nunavut, Canada 
1

Ihre eingefügte Probe Datei ist ein wenig mehrdeutig: es ist nicht möglich, mit dem Auge zu sehen, wenn etwas, das wie ein paar Leerzeichen aussieht, beispielsweise ein Tab ist oder nicht.

Im Allgemeinen jedoch beachten Sie, dass einfaches altes Python ausdrucksstärker ist als Pandas oder CSV-Module (Pandas Stärke ist elseswhere). Z. B. gibt es sogar Python-Module für rekursive Abstiegs-Parser, denen die Pandas offensichtlich fehlen. Sie können reguläres Python verwenden, um die Datei in ein einfacheres Format für Pandas zu verwandeln. Zum Beispiel:

import re 
>>> ['@'.join(re.split(r'[ \t]+', l.strip(), maxsplit=8)) for l in open('stuff.tsv') if l.strip()] 
['[email protected]@[email protected]@[email protected]@[email protected][email protected]', 
'[email protected]@[email protected]@[email protected]@[email protected]@Alert, Nunavut, Canada'] 

ändert das Trennzeichen '@', die, wenn Sie zurück in eine Datei schreiben, zum Beispiel, können Sie mit delimiter='@' analysieren.

Verwandte Themen