¿Cómo hacer que el separador en pandas read_csv sea más flexible con espacios en blanco, para separadores irregulares?

Resuelto Roman asked hace 11 años • 4 respuestas

Necesito crear un marco de datos leyendo datos de un archivo, usando read_csvel método. Sin embargo, los separadores no son muy regulares: algunas columnas están separadas por tabulaciones ( \t), otras por espacios. Además, algunas columnas pueden estar separadas por 2, 3 o más espacios o incluso por una combinación de espacios y tabulaciones (por ejemplo, 3 espacios, dos tabulaciones y luego 1 espacio).

¿Hay alguna manera de decirle a los pandas que traten estos archivos correctamente?

Por cierto, no tengo este problema si uso Python. Yo suelo:

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

Y funciona perfecto. No importa si hay 2 o 3 espacios entre los campos. Incluso las combinaciones de espacios y tabulaciones no causan ningún problema. ¿Pueden los pandas hacer lo mismo?

Roman avatar Feb 22 '13 21:02 Roman
Aceptado

Según la documentación , puede utilizar una expresión regular 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
DSM avatar Feb 22 '2013 14:02 DSM
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

usaría cualquier combinación de cualquier número de espacios y tabulaciones como separador.

Peaceful avatar Dec 25 '2016 11:12 Peaceful

Pandas tiene dos lectores de csv, solo es flexible con respecto a los espacios en blanco iniciales redundantes:

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

mientras uno no es

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

Ninguno de los dos es flexible desde el principio con respecto a los espacios en blanco finales; consulte las respuestas con expresiones regulares. Evite delim_whitespace, ya que también permite solo espacios (sin o \t) como separadores.

Gerben avatar Nov 04 '2017 14:11 Gerben

Podemos considerar que esto se ocupa de todas las combinaciones y de cero o más ocurrencias.

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")
yoonghm avatar Oct 27 '2017 04:10 yoonghm