tutorial read_csv read panda into index functions example python csv pandas dataframe whitespace

read_csv - python pandas read csv example



¿Cómo hacer separator en read_csv más flexible wrt whitespace? (4)

Necesito crear un marco de datos usando datos almacenados en un archivo. Para eso quiero usar el método read_csv . Sin embargo, el separador no es muy regular. Algunas columnas están separadas por pestañas ( /t ), otras están separadas por espacios. Además, algunas columnas pueden estar separadas por 2 o 3 o más espacios o incluso por una combinación de espacios y pestañas (por ejemplo, 3 espacios, dos pestañas 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 pestañas no causan ningún problema. ¿Pueden los pandas hacer lo mismo?


De la documentation , puede usar un 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


Pandas tiene dos lectores csv, solo es flexible con respecto al espacio en blanco líder redundante:

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

mientras que uno no es

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

Ninguno de los dos es flexible con respecto al espacio en blanco al final, vea las respuestas con expresiones regulares. Evita delim_whitespace, ya que también permite espacios simples (sin, o / t) como separadores.


Podemos considerar esto para cuidar toda la combinación y cero o más ocurrencias.

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


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

usaría cualquier combinación de cualquier cantidad de espacios y pestañas como separador.