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.
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.
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)

