Manejar archivos CSV con pandas
Contents
Manejar archivos CSV con pandas
#
Para trabajar con archivos CSV de tamaño modesto, es suficiente (y recomendable) utilizar la librería csv
, pero para poder trabajar con archivos CSV de gran tamaño y complejidad, es recomendado apelar a la librería pandas
.
Esta librería fue creada por Wes McKinney en 2008 y es una de las más utilizadas en el mundo de la ciencia de datos. pandas
es una librería de código abierto que provee estructuras de datos y herramientas de análisis de datos de alto rendimiento y fácil de usar. En particular, pandas
provee estructuras de datos y operaciones para manipular tablas numéricas y series temporales. Además, pandas
está construida sobre numpy
, por lo que es posible utilizar las funciones de numpy
en pandas
.
En este curso, simplemente utilizaremos la librería pandas
para leer y escribir archivos CSV. Para aprender más sobre pandas
, te recomiendo explorar el libro de Wes McKinney, Python for Data Analysis [McKinney, 2018].
Nota
En muchos foros se suele comentar que utilizar pandas
simplemente para leer y escribir archivos CSV es como utilizar un tanque para matar una mosca. Ten esto en cuenta para el momento de utilizar esta librería en un entorno de desarrollo profesional.
Instalar pandas
#
Para instalar pandas
, podemos utilizar pip
o conda
:
pip install pandas
conda install pandas
La versión actual (abril 2023) es la 2.0.1. Sin embargo, es posible que gran parte de los tutoriales que existen en la actualidad dependan de la versión 1.5 o anterior. Verifica cuál es la versión de tu instalación de pandas
con el siguiente código:
import pandas as pd
print(pd.__version__)
1.5.3
La versión que ves arriba será la que utilizaremos en este tutorial.
Leer archivos CSV#
Para leer un archivo CSV con pandas
, podemos utilizar el método read_csv()
. Este método tiene muchos argumentos opcionales que permiten configurar la lectura del archivo CSV. Pasemos a leer nuestro archivo inventario.csv
con pandas
:
import pandas as pd
import os
import chardet
# usaremos en este ejemplo la librería chardet para detectar el encoding del archivo
raw = open(os.path.join(os.getcwd(), "inventario.csv"), 'rb').read()
encodign = chardet.detect(raw)['encoding']
df = pd.read_csv(os.path.join(os.getcwd(), "inventario.csv"), encoding=encodign)
print(df)
titulo autor editorial anio
0 El Aleph Jorge Luis Borges Emece 1949
1 El Quijote Miguel de Cervantes Alfaguara 2005
2 El desbarrancadero Fernando Vallejo Planeta 2001
3 Una novelita Lumpen Roberto Bolaño Anagrama 2002
4 El amante Marguerite Duras Tusquets 1984
Como verás, únicamente requerimos de la función read_csv
para leer el archivo CSV. Para poder hacer frente a una cantidad de posibles formas de creación del archivo, pandas
cuenta con un buen número de parámetros que permiten solventar archivos con separadores diferentes a comas (sep=";"
), con encabezados (header=0
), con índices (index_col=0
), con valores faltantes (na_values=[""]
), etc. Para conocer todos los parámetros de la función read_csv
, puedes consultar la documentación oficial.
El resultado de la lectura del archivo CSV es un objeto de tipo DataFrame
de pandas
. Un DataFrame
es una estructura de datos bidimensional que puede contener datos de diferentes tipos (numéricos, de cadena de caracteres, booleanos, etc.). En este caso, el DataFrame
contiene los datos del archivo CSV, con los tipos de datos que pandas
consideró más adecuados para cada columna.
print(type(df))
<class 'pandas.core.frame.DataFrame'>
Escribir archivos CSV#
Para escribir un archivo CSV con pandas
, podemos utilizar el método to_csv()
. Sin embargo, debemos convertir los datos que queremos a un formato de DataFrame
para que puedan ser guardados en la tabla. Por ejemplo, si queremos guardar los datos de un diccionario, podemos convertirlo a un DataFrame
y luego guardarlo en un archivo CSV:
import pandas as pd
diccionario = {
"nombre": ["Juan", "María", "Pedro"],
"edad": [25, 30, 40],
"ciudad": ["Bogotá", "Medellín", "Cali"]
}
df = pd.DataFrame(diccionario)
df.to_csv("diccionario.csv", index=False, encoding="utf-8")
Y podemos compronbar que el archivo CSV se creó correctamente:
df = pd.read_csv("diccionario.csv")
print(df)
nombre edad ciudad
0 Juan 25 Bogotá
1 María 30 Medellín
2 Pedro 40 Cali
Agregar datos a un CSV con pandas
#
En este caso, lo que debemos realizar es una lectura del archivo CSV, agregar los datos que queremos y luego escribir el archivo CSV. Por ejemplo, si queremos agregar una nueva fila al archivo diccionario.csv
, podemos hacer lo siguiente:
import pandas as pd
df = pd.read_csv("diccionario.csv")
nueva_fila = {
"nombre": "Luis",
"edad": 35,
"ciudad": "Barranquilla"
}
df = pd.concat([df, pd.DataFrame(nueva_fila, index=[0])])
df.to_csv("diccionario.csv", index=False, encoding="utf-8")
Y podemos comprobar que el archivo CSV se creó correctamente:
df = pd.read_csv("diccionario.csv")
print(df)
nombre edad ciudad
0 Juan 25 Bogotá
1 María 30 Medellín
2 Pedro 40 Cali
3 Luis 35 Barranquilla
Paradójicamente, si queremos simplemente agregar una fila al archivo CSV, es más eficiente utilizar la librería csv
que pandas
. Sin embargo, si queremos agregar varias filas, es mucho mejor utilizar pandas
. Depende de las necesidades del programa que utilicemos o no pandas
para agregar datos a un archivo CSV.
Eliminar datos de un CSV con pandas
#
En este caso, lo que debemos realizar es una lectura del archivo CSV, eliminar los datos que queremos y luego escribir el archivo CSV. Por ejemplo, si queremos eliminar la fila con nombre “María” del archivo diccionario.csv
, podemos hacer lo siguiente:
import pandas as pd
df = pd.read_csv("diccionario.csv")
df = df[df["nombre"] != "María"]
df.to_csv("diccionario.csv", index=False, encoding="utf-8")
Y podemos comprobar que el archivo CSV se creó correctamente:
df = pd.read_csv("diccionario.csv")
print(df)
nombre edad ciudad
0 Juan 25 Bogotá
1 Pedro 40 Cali
2 Luis 35 Barranquilla
Actualizar datos de un CSV con pandas
#
En este caso, lo que debemos realizar es una lectura del archivo CSV, actualizar los datos que queremos y luego escribir el archivo CSV. Por ejemplo, si queremos actualizar la edad de la fila con nombre “Pedro” del archivo diccionario.csv
, podemos hacer lo siguiente:
import pandas as pd
df = pd.read_csv("diccionario.csv")
df.loc[df["nombre"] == "Pedro", "edad"] = 45
df.to_csv("diccionario.csv", index=False, encoding="utf-8")
Y podemos comprobar que el archivo CSV se creó correctamente:
df = pd.read_csv("diccionario.csv")
print(df)
nombre edad ciudad
0 Juan 25 Bogotá
1 Pedro 45 Cali
2 Luis 35 Barranquilla
La gran ventaja de los dos ejemplos anteriores con respecto a la librería csv
es que no tenemos que crear un archivo temporal para luego renombrarlo. pandas
se encarga de todo esto por nosotros.
Crear una nueva columna en un CSV con pandas
#
En este caso, lo que debemos realizar es una lectura del archivo CSV, crear la nueva columna y luego escribir el archivo CSV. Por ejemplo, si queremos crear una nueva columna con el nombre “pais_nacimiento” en el archivo diccionario.csv
, podemos hacer lo siguiente:
import pandas as pd
df = pd.read_csv("diccionario.csv")
df["pais_nacimiento"] = ["Colombia", "Perú", "Colombia"]
df.to_csv("diccionario.csv", index=False, encoding="utf-8")
Y podemos comprobar que el archivo CSV se creó correctamente:
df = pd.read_csv("diccionario.csv")
print(df)
nombre edad ciudad pais_nacimiento
0 Juan 25 Bogotá Colombia
1 Pedro 45 Cali Perú
2 Luis 35 Barranquilla Colombia
Eliminar una columna de un CSV con pandas
#
En este caso, lo que debemos realizar es una lectura del archivo CSV, eliminar la columna y luego escribir el archivo CSV. Por ejemplo, si queremos eliminar la columna “pais_nacimiento” del archivo diccionario.csv
, podemos hacer lo siguiente:
import pandas as pd
df = pd.read_csv("diccionario.csv")
df = df.drop(columns=["pais_nacimiento"])
df.to_csv("diccionario.csv", index=False, encoding="utf-8")
Y podemos comprobar que el archivo CSV se creó correctamente:
df = pd.read_csv("diccionario.csv")
print(df)
nombre edad ciudad
0 Juan 25 Bogotá
1 Pedro 45 Cali
2 Luis 35 Barranquilla
Actualizar una columna de un CSV con pandas
#
En este caso, lo que debemos realizar es una lectura del archivo CSV, actualizar la columna y luego escribir el archivo CSV. Por ejemplo, si queremos actualizar la columna “ciudad” del archivo diccionario.csv
, podemos hacer lo siguiente:
import pandas as pd
df = pd.read_csv("diccionario.csv")
df["ciudad"] = ["Barranquilla", "Cali", "Tunja"]
df.to_csv("diccionario.csv", index=False, encoding="utf-8")
Y podemos comprobar que el archivo CSV se creó correctamente:
df = pd.read_csv("diccionario.csv")
print(df)
nombre edad ciudad
0 Juan 25 Barranquilla
1 Pedro 45 Cali
2 Luis 35 Tunja
Conclusión#
En este tutorial apenas arañamos la superficie de lo que se puede hacer con pandas
. Sin embargo, es suficiente para que puedas empezar a utilizar esta librería para leer, escribir y actualizar archivos CSV.
Ejercicios#
Crea un archivo CSV con los datos de tu biblioteca personal. Cada fila debe tener los siguientes datos: título, autor, editorial, año de publicación, género y número de páginas. Luego, crea un programa que lea el archivo CSV y muestre los datos de todos los libros que sean de un género específico.
Crea una pequeña interface que permita agregar, eliminar y actualizar los datos del archivo CSV. Puedes aprovechar la librería
csv
opandas
para realizar esta tarea.