Pandas read_csv() en Python con ejemplo

⚡ Resumen inteligente

La función read_csv() de Pandas convierte un archivo separado por comas, ya sea local o remoto, en un DataFrame con una sola llamada. Este tutorial importa el conjunto de datos del censo de adultos de la UCI, nombra sus quince columnas y resume el resultado con agregaciones groupby.

  • 🔘 Una llamada: pd.read_csv() acepta una ruta de archivo, un URLo cualquier objeto que exponga un método de lectura.
  • ☑️ Control de columnas: Pase nombres para etiquetar las columnas e index_col=False para mantener un índice entero simple.
  • ✅ Espacio en blanco: skipinitialspace=True elimina el espacio que sigue a cada coma en el conjunto de datos para adultos.
  • 🧪 Agrupar y agregar: groupby() resume el marco con recuento, mínimo, máximo, media, mediana o desviación estándar.
  • 🛠️ Archivos grandes: Las opciones usecols, dtype y chunksize reducen el tiempo de análisis y el consumo de memoria en exportaciones de varios gigabytes.
  • ⚠️ Errores comunes: La codificación, las líneas defectuosas y los tipos de datos mixtos tienen cada uno un argumento documentado que los corrige.

Pandas read_csv() con ejemplo

Importar CSV en Pandas

Durante el tutorial de TensorFlow, utilizarás el conjunto de datos para adultos, que se usa a menudo para tareas de clasificación. El archivo que se usa a continuación es el archivo sin procesar. adult.data exportación desde el repositorio de aprendizaje automático de la UCI, y la página del conjunto de datos también ofrece una descarga comprimida y la ucimlrepo paquete si la ruta directa deja de funcionar.

Los datos se almacenan en formato CSV. El conjunto de datos incluye 8 variables categóricas:

  • clase de trabajo
  • educación
  • marital
  • Ocupación.
  • relación
  • raza
  • vie
  • patria

Y 6 variables continuas:

  • edad
  • fnlwgt
  • núm_educación
  • ganancia capital
  • perdida de capital
  • horas_semana

Junto con los ingresos label columna, eso hace que los 15 nombres de columna que pasarás a pandas en la siguiente sección.

Método pandas read_csv()

Para importar un conjunto de datos CSV, puede utilizar el objeto pd.read_csv(). La firma básica es:

Sintaxis de pandas read_csv()

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • ruta_de_archivo_o_buffer: camino, URL, o un objeto similar a un archivo que contiene los datos
  • sep=',': el delimitador a utilizar
  • nombres=Ninguno: nombre las columnas. Si el conjunto de datos tiene diez columnas, debe pasar diez nombres.
  • columna_índice=Ninguna: qué columna usar como índice de fila. Pase False para forzar un nuevo índice entero.
  • skipinitialspace=False: omitir espacios después del delimitador

Para ver la lista completa de argumentos, consulte el sitio web oficial. Documentación de pandas.read_csv().

Pandas read_csv() Ejemplo

El fragmento que aparece a continuación nombra las 15 columnas, apunta al archivo UCI y elimina el espacio que sigue a cada coma en este conjunto de datos en particular.

## Import csv
import pandas as pd
## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
           'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
           'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
df_train = pd.read_csv(PATH,
                       skipinitialspace=True,
                       names = COLUMNS,
                       index_col=False)
df_train.shape

Salida:

(32561, 15)

La forma confirma 32,561 filas y 15 columnas, por lo que cada nombre en COLUMNS se asoció con un campo en el archivo.

Parámetros clave de la función read_csv() de Pandas

La función read_csv() acepta más de cincuenta argumentos, pero un pequeño grupo cubre prácticamente todas las importaciones reales. Los valores predeterminados que se muestran a continuación son los documentados en la referencia actual de la API de pandas.

Parámetro Predeterminado ¿Qué hace?
sep ',' Carácter o expresión regular utilizada como delimitador. Use sep=';' o sep='\t' para otros formatos.
encabezamiento 'inferir' Número de fila que contiene las etiquetas de las columnas. Pase header=None cuando el archivo no tenga fila de encabezado.
nombres no se establece Lista explícita de etiquetas de columna. Combínala con header=0 para reemplazar un encabezado existente.
columna_índice Ninguna Columna que se utilizará como índice de fila. index_col=False fuerza un índice entero simple.
usar columnas Ninguna Subconjunto de columnas a cargar, por etiqueta o posición. Reduce tanto el tiempo de análisis como el consumo de memoria.
dtype Ninguna Tipos de datos por columna, por ejemplo {'edad': 'int32'}. Omite la inferencia de tipos.
valores na Ninguna Cadenas adicionales que se leerán como NaN, como el marcador de posición '?' en el conjunto de datos de adultos.
filas salteadas / filas n Ninguna Omitir las líneas iniciales o leer solo las primeras N filas de datos.
analizar_fechas Ninguna Columnas que se convertirán a formato de fecha y hora durante la lectura, junto con el formato de fecha.
codificación 'utf-8' Codificación de texto del archivo. Utilice 'latin-1' o 'cp1252' para exportaciones antiguas.
tamaño de porción Ninguna Devuelve un iterador que genera el archivo en bloques de N filas.
en líneas malas 'error' Qué hacer con las filas mal formadas: elevarlas, advertir sobre ellas u omitirlas.

Dos de ellos merecen ser mencionados. index_col=False no es lo mismo que dejarlo sin configurar: le indica explícitamente a Pandas que no promueva la primera columna, que es lo que se desea cuando un archivo termina cada línea con un delimitador suelto. Y names sobrescribe silenciosamente lo que declare el archivo, así que pásalo header=0 junto a ella cuando el archivo CSV realmente contiene una fila de encabezado.

Método Pandas groupby()

Una forma sencilla de visualizar los datos es usar el método `groupby`. Este método permite resumir los datos por grupo. A continuación, se muestra una lista de las agregaciones disponibles con el método `groupby()`:

  • contar: contar
  • mín: mín.
  • máx: máximo
  • significar: significar
  • mediana: mediana
  • desviación estándar: std
  • y otros

Dentro de groupby(), se especifica la columna por la que se desea agrupar antes de aplicar la agregación.

Echemos un vistazo a un solo grupoping Con el conjunto de datos para adultos, obtendrá la media de todas las variables continuas según el tipo de ingreso, es decir, superior a 50 o inferior a 50:

df_train.groupby(['label']).mean()
Etiqueta edad fnlwgt núm_educación ganancia capital perdida de capital horas_semana
<= 50 K 36.783738 190340.86517 9.595065 148.752468 53.142921 38.840210
> 50K 44.249841 188005.00000 11.611657 4006.142456 195.001530 45.473026

Puedes obtener la edad mínima según el tipo de hogar:

df_train.groupby(['label'])['age'].min()
label
<=50K    17
>50K     19
Name: age, dtype: int64

También puede agrupar por varias columnas. Por ejemplo, puede obtener la máxima ganancia de capital según el tipo de hogar y el estado civil.

df_train.groupby(['label', 'marital'])['capital_gain'].max()
label  marital
<=50K  Divorced                 34095
       Married-AF-spouse         2653
       Married-civ-spouse       41310
       Married-spouse-absent     6849
       Never-married            34095
       Separated                 7443
       Widowed                   6849
>50K   Divorced                 99999
       Married-AF-spouse         7298
       Married-civ-spouse       99999
       Married-spouse-absent    99999
       Never-married            99999
       Separated                99999
       Widowed                  99999
Name: capital_gain, dtype: int64

Puedes crear un gráfico después de agrupar los datos. Una forma de hacerlo es graficar directamente el resultado agrupado.

Para obtener un gráfico más claro, aplique `unstack()` después de `mean()` para que el estado civil pase del índice a las columnas. De esta forma, el gráfico tendrá dos grupos, uno por cada nivel de ingresos, en lugar de las catorce (2*7) barras que generaría un índice multinivel plano.

Si utiliza un Jupyter NotebookRecuerda añadir %matplotlib en línea; de lo contrario, no se mostrará ningún gráfico.

%matplotlib inline
df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack()
df_plot

Al representar ese marco no apilado como un gráfico de barras, se obtiene la siguiente figura.

Gráfico de barras agrupadas de la ganancia de capital promedio por nivel de ingresos y estado civil.

Cómo leer archivos CSV grandes con Pandas

El conjunto de datos para adultos es pequeño, pero la misma llamada puede bloquearse al exportar datos de varios gigabytes. Tres argumentos realizan la mayor parte del trabajo.

  • usar columnas Carga únicamente las columnas que realmente necesitas. La documentación de pandas señala que esto resulta en un análisis mucho más rápido y un menor consumo de memoria.
  • dtype Asigna un tipo a cada columna, por lo que Pandas omite la inferencia y no amplía los enteros a 64 bits de forma predeterminada.
  • tamaño de porción Devuelve un TextFileReader en lugar de un DataFrame, lo que te permite iterar sobre bloques de N filas y agregarlas a medida que avanzas.
import pandas as pd

# read only the columns you need, with explicit types
cols  = ['age', 'education', 'capital_gain', 'label']
types = {'age': 'int32', 'capital_gain': 'int32'}
df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types,
                 skipinitialspace=True, index_col=False)

# stream the file in fixed-size chunks instead of loading it whole
total = 0
for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000,
                         skipinitialspace=True, index_col=False):
    total = total + len(chunk)
print(total)

Una vez establecidos los aspectos básicos, existen dos opciones adicionales que resultan útiles. engine='pyarrow' cambia al analizador Arrow multihilo y dtype_backend='pyarrow' Mantiene el resultado en columnas con flechas de fondo. low_memory es True por defecto, lo que analiza el archivo internamente por partes, pero puede producir tipos mixtos en una columna; establezca un dtype explícito en lugar de confiar en él.

Finalmente, compression='infer' Esto significa que una ruta que termina en .gz, .zip, .bz2, .xz o .zst se descomprime sobre la marcha, por lo que no es necesario descomprimir un archivo antes de leerlo.

Errores comunes en la función read_csv() de Pandas y cómo solucionarlos.

La mayoría de los fallos de read_csv() se deben a cuatro causas, y cada una tiene un argumento documentado que la resuelve.

Error Causa Solución
FileNotFoundError La ruta es relativa al directorio de trabajo, no al script. Utilice una ruta absoluta o confirme la URL El esquema es uno de http, ftp, s3, gs o file.
Error de decodificación Unicode El archivo no está en UTF-8, que es la codificación predeterminada. Pase encoding='latin-1' o el códec correcto, o encoding_errors='replace'.
ParserError: Error al tokenizar los datos Una fila contiene más campos de los que declara el encabezado. Pasa on_bad_lines='skip' o 'warn', o establece la separación correcta.
DtypeWarning: las columnas tienen tipos mixtos La inferencia de tipos segmentada detectó diferentes tipos en una misma columna. Establezca un tipo de datos explícito o low_memory=False.
Columnas desplazadas una posición Un delimitador final hace que Pandas promueva el primer campo al índice. Pasar index_col=False.

El conjunto de datos para adultos muestra directamente el caso de valores faltantes: las entradas desconocidas de workclass, occupation y native_country se almacenan como un signo de interrogación literal, por lo que llegan como la cadena '?' a menos que las declare.

# tolerate rows with too many fields instead of raising
df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip')

# read a file that is not UTF-8
df = pd.read_csv('sales.csv', encoding='latin-1')

# treat the dataset's '?' placeholder as a missing value
df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

Preguntas Frecuentes

Ambas funciones utilizan el mismo analizador. `read_csv()` usa por defecto un delimitador de coma, mientras que `read_table()` lee archivos delimitados generales y espera que usted mismo configure el delimitador. Use `read_csv()` para archivos separados por comas y `read_table()` para exportaciones separadas por tabulaciones o barras verticales.

Llamar a df.to_csv('output.csv', index=False). Eliminarping El índice evita que la primera columna quede sin nombre en la siguiente lectura. Añada los argumentos sep, encoding o compression para que reflejen la configuración que utilizó al importar el archivo.

Pase parse_dates con los nombres o posiciones de las columnas y agregue date_format cuando el formato no sea ISO 8601; por ejemplo, date_format='%d/%m/%Y'. Sin esto, las columnas de fecha llegarán como cadenas de objetos simples y requerirán una llamada a to_datetime por separado.

Establezca sep al carácter, como sep=';' o sep='\t'. Los separadores de más de un carácter se tratan como expresiones regulares y fuerzan el procesamiento más lento. Python engine. sep=None permite que ese motor detecte el delimitador de la primera fila válida.

Utilice `nrows` para limitar el número de filas de datos devueltas y `skiprows` para saltarse un bloque de líneas iniciales. Al combinarlos, se recorren las páginas de un archivo; por ejemplo, `skiprows=1000000` con `nrows=999999` para leer el segundo millón de filas.

Sí. La compresión está configurada por defecto en 'inferir', por lo que una ruta que termine en .gz, .zip, .bz2, .xz o .zst se descomprime automáticamente. URLs usando http, ftp, s3, gs o file todos funcionan, y storage_options pasa las credenciales al backend remoto.

Los modelos entrenados detectan posibles errores tipográficos, agrupan las categorías con ortografía similar e imputan los valores faltantes a partir de las columnas circundantes. Esto reduce la limpieza manual a las filas que una configuración de na_values ​​o dtype basada en reglas no puede resolver por sí sola.

Copilot genera rápidamente el código base una vez que puede ver una muestra del archivo. Considere la lista de argumentos como un borrador, ya que a menudo adivina el tipo de datos y la codificación. Verifique cada palabra clave generada con la referencia de la API de pandas antes de ejecutarla.

Resumir este post con: