2013-02-22 13 views
34

Ho bisogno di creare un frame di dati utilizzando i dati memorizzati in un file. Per questo voglio usare il metodo read_csv. Tuttavia, il separatore non è molto regolare. Alcune colonne sono separate da tabulazioni (\t), altre sono separate da spazi. Inoltre, alcune colonne possono essere separate da 2 o 3 o più spazi o anche da una combinazione di spazi e tabulazioni (ad esempio 3 spazi, due schede e quindi 1 spazio).Come rendere il separatore in read_csv più flessibile rispetto allo spazio bianco?

C'è un modo per dire ai panda di trattare questi file correttamente?

A proposito, non ho questo problema se utilizzo Python. Io uso:

for line in file(file_name): 
    fld = line.split() 

E funziona perfettamente. Non importa se ci sono 2 o 3 spazi tra i campi. Anche le combinazioni di spazi e tabulazioni non causano alcun problema. I panda possono fare lo stesso?

risposta

58

Dal documentation, è possibile utilizzare una regex o delim_whitespace:

>>> import pandas as pd 
>>> for line in open("whitespace.csv"): 
...  print repr(line) 
...  
'a\t b\tc 1 2\n' 
'd\t e\tf 3 4\n' 
>>> pd.read_csv("whitespace.csv", header=None, delimiter=r"\s+") 
    0 1 2 3 4 
0 a b c 1 2 
1 d e f 3 4 
>>> pd.read_csv("whitespace.csv", header=None, delim_whitespace=True) 
    0 1 2 3 4 
0 a b c 1 2 
1 d e f 3 4 
+1

Puoi anche usare 'skipinitialspace' per saltare lo spazio iniziale – jarondl

5
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+") 

sarebbe utilizzare qualsiasi combinazione di qualsiasi numero di spazi e tabulazioni come separatore.

0

Possiamo prendere in considerazione questo per occuparci di tutte le combinazioni e di zero o più occorrenze.

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*") 
0

Pandas ha due lettori csv, solo è flessibile per quanto riguarda ridondante di primo piano lo spazio bianco:

pd.read_csv("whitespace.csv", skipinitialspace=True) 

mentre uno non è

pd.DataFrame.from_csv("whitespace.csv") 

Né è out-of-the-box flessibile per quanto riguarda lo spazio bianco finale, vedere le risposte con espressioni regolari. Evita delim_whitespace, in quanto consente anche solo spazi (senza, o \ t) come separatori.

Problemi correlati