¿Cómo hacer que el separador en pandas read_csv sea más flexible con espacios en blanco, para separadores irregulares?
Necesito crear un marco de datos leyendo datos de un archivo, usando read_csv
el 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?
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
>>> 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.
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.
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]*")