ti-enxame.com

Como tornar o separador no espaço em branco wrt mais flexível de pandas read_csv?

Eu preciso criar um quadro de dados usando os dados armazenados em um arquivo. Para isso, quero usar o método read_csv. No entanto, o separador não é muito regular. Algumas colunas são separadas por tabulações (\t), outras são separadas por espaços. Além disso, algumas colunas podem ser separadas por 2 ou 3 ou mais espaços ou mesmo por uma combinação de espaços e tabulações (por exemplo, 3 espaços, duas guias e, em seguida, 1 espaço).

Existe uma maneira de dizer ao pandas para tratar esses arquivos corretamente?

A propósito, eu não tenho esse problema se eu usar o Python. Eu uso:

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

E funciona perfeito. Não importa se existem 2 ou 3 espaços entre os campos. Mesmo combinações de espaços e tabulações não causam nenhum problema. pandas podem fazer o mesmo?

48
Roman

No documentação , você pode usar um regex ou 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
88
DSM
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

usaria qualquer combinação de qualquer número de espaços e tabulações como separador.

8
Peaceful

O Pandas possui dois leitores csv, sendo flexível apenas em relação a espaços em branco redundantes:

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

enquanto um não é

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

Nem é flexível de imediato quanto ao espaço em branco à direita, veja as respostas com expressões regulares. Evite delim_whitespace, pois também permite apenas espaços (sem ou\t) como separadores.

0
Gerben

Podemos considerar isso para cuidar de toda a combinação e zero ou mais ocorrências.

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