2014-10-24 11 views
8

ho un po 'di dati che assomiglia a questo:importazione di testo per i panda con più delimitatori

c stuff 
c more header 
c begin data   
1 1:.5 
1 2:6.5 
1 3:5.3 

voglio importarlo in un frame di dati 3 colonne, con colonne per esempio

a , b, c 
1, 1, 0.5 
etc 

ho cercato di leggere i dati da 2 colonne divisi sulla ':', e poi di dividere il prima colonna ''. Comunque lo trovo fastidioso. C'è un modo migliore per ordinarlo direttamente sull'importazione?

attualmente:

data1 = pd.read_csv(file_loc, skiprows = 3, delimiter = ':', names = ['AB', 'C']) 
data2 = pd.DataFrame(data1.AB.str.split(' ',1).tolist(), names = ['A','B']) 

Tuttavia questo è ulteriormente complicata dal fatto miei dati ha uno spazio iniziale ...

mi sento come questo dovrebbe essere un compito semplice, ma al momento sto pensando di leggerlo riga per riga e usare alcuni find replace per sanitizzare i dati prima dell'importazione.

risposta

19

Un modo potrebbe essere quello di utilizzare i separatori regex consentiti dal motore python. Ad esempio:

>>> !cat castle.dat 
c stuff 
c more header 
c begin data   
1 1:.5 
1 2:6.5 
1 3:5.3 
>>> df = pd.read_csv('castle.dat', skiprows=3, names=['a', 'b', 'c'], 
        sep=' |:', engine='python') 
>>> df 
    a b c 
0 1 1 0.5 
1 1 2 6.5 
2 1 3 5.3 
+0

Questo sembra esattamente quello di cui avevo bisogno. Grazie – CastleH

+0

Mi sento un po 'più imbarazzato a non notare l'argomento "sep" nei documenti ora ...: -/ – CastleH

+0

Perché sto utilizzando un' Errore Parser 'quando utilizzo questo metodo? 'pandas.errors.ParserError: 29 campi previsti nella riga 11, visto 45. L'errore potrebbe essere dovuto al fatto che le virgolette vengono ignorate quando viene utilizzato un delimitatore a più carateri. – user77005

Problemi correlati