Uno de los formatos más utilizados en la actualidad para intercambio de datos es CSV (“Comma Separated Values”). Estas son básicamente archivos de texto en los que cada línea contiene una fila de datos con múltiples registros delimitados por un separador. Tradicionalmente el separador suele ser la coma, de ahí el nombre del formato. Aunque también se pueden utilizan otros caracteres que no suelen estar contenidos en los datos. Por ejemplo, espacios, tabuladores y puntos y coma. Lo que los hace muy fáciles de procesar y son soportados por cualquier aplicación. Incluso son fáciles de leer por personas con editores de texto. Por eso es clave saber guardar y leer archivos CVS con Python.
Guardado de archivos CSV
Para guardar un archivo CSV es necesario disponer en primer lugar de un dataframe en memoria. Por lo que se pude crear uno de ejemplo. Una vez generado el este se puede volcar a un archivo CSV utilizando el método to_csv
.
import pandas as pd data = {'first_name': ['Sigrid', 'Joe', 'Theodoric','Kennedy', 'Beatrix', 'Olimpia', 'Grange', 'Sallee'], 'last_name': ['Mannock', 'Hinners', 'Rivers', 'Donnell', 'Parlett', 'Guenther', 'Douce', 'Johnstone'], 'age': [27, 31, 36, 53, 48, 36, 40, 34], 'amount_1': [7.17, 1.90, 1.11, 1.41, 6.69, 4.62, 1.01, 4.88], 'amount_2': [8.06, "?", 5.90, "?", "?", 7.48, 4.37, "?"]} df = pd.DataFrame(data, columns = ['first_name', 'last_name', 'age', 'amount_1', 'amount_2']) df.to_csv('example.csv')
En caso de que se desee cambiar el delimitador se puede indicar con la propiedad sep
. Para que este sea punto y coma simplemente se ha de escribir:
df.to_csv('example_semicolon.csv', sep=';')
Lectura de archivos CSV
La lectura de los archivos se realiza con el método read_csv
de pandas. Solamente se la ha de indicar la ruta al archivo.
df = pd.read_csv('example.csv') df
Unnamed first_name last_name age amount_1 amount_2
0 0 Sigrid Mannock 27 7.17 8.06
1 1 Joe Hinners 31 1.90 ?
2 2 Theodoric Rivers 36 1.11 5.9
3 3 Kennedy Donnell 53 1.41 ?
4 4 Beatrix Parlett 48 6.69 ?
5 5 Olimpia Guenther 36 4.62 7.48
6 6 Grange Douce 40 1.01 4.37
7 7 Sallee Johnstone 34 4.88 ?
Al igual que antes se puede indicar el separador utilizado mediante la propiedad sep
.
df = pd.read_csv('example_semicolon.csv', sep=';')
Por defecto se utiliza la primera línea del fichero como cabecera para asignar los nombres a las columnas. En el caso de que el archivo no disponga de cabecera se puede evitar esto asignando None
a la propiedad head
.
df = pd.read_csv('example.csv', header=None) df
0 1 2 3 4 5 0 NaN first_name last_name age amount_1 amount_2 1 0.0 Sigrid Mannock 27 7.17 8.06 2 1.0 Joe Hinners 31 1.9 ? 3 2.0 Theodoric Rivers 36 1.11 5.9 4 3.0 Kennedy Donnell 53 1.41 ? 5 4.0 Beatrix Parlett 48 6.69 ? 6 5.0 Olimpia Guenther 36 4.62 7.48 7 6.0 Grange Douce 40 1.01 4.37 8 7.0 Sallee Johnstone 34 4.88 ?
El archivo que se ha utilizado en esta ocasión tiene cabecera, por lo que esta se ha cargado como la primera fila. En caso de que se desee ignorar una o más filas se le puede indicar medítate la propiedad skiprows
.
df = pd.read_csv('example.csv', header=None, skiprows=1) df
0 1 2 3 4 5 0 0 Sigrid Mannock 27 7.17 8.06 1 1 Joe Hinners 31 1.90 ? 2 2 Theodoric Rivers 36 1.11 5.9 3 3 Kennedy Donnell 53 1.41 ? 4 4 Beatrix Parlett 48 6.69 ? 5 5 Olimpia Guenther 36 4.62 7.48 6 6 Grange Douce 40 1.01 4.37 7 7 Sallee Johnstone 34 4.88 ?
Los nombres de las columnas del dataframe se pueden indicar mediante la propiedad names
.
df = pd.read_csv('example.csv', skiprows = 1, names=['UID', 'First Name', 'Last Name', 'Age', 'Sales #1', 'Sales #2']) df
UID First Name Last Name Age Sales #1 Sales #2 0 0 Sigrid Mannock 27 7.17 8.06 1 1 Joe Hinners 31 1.90 ? 2 2 Theodoric Rivers 36 1.11 5.9 3 3 Kennedy Donnell 53 1.41 ? 4 4 Beatrix Parlett 48 6.69 ? 5 5 Olimpia Guenther 36 4.62 7.48 6 6 Grange Douce 40 1.01 4.37 7 7 Sallee Johnstone 34 4.88 ?
Es posible que los archivos contengan valores nulos. En el ejemplo se puede ver que este es ?
. La propiedad que permite que se asigne un valor nulo cuando se encuentra un valor dado es na_values=['.']
df = pd.read_csv('example.csv', skiprows=1, names=['UID', 'First Name', 'Last Name', 'Age', 'Sales #1', 'Sales #2'], na_values=['?']) df
UID First Name Last Name Age Sales #1 Sales #2 0 0 Sigrid Mannock 27 7.17 8.06 1 1 Joe Hinners 31 1.90 NaN 2 2 Theodoric Rivers 36 1.11 5.9 3 3 Kennedy Donnell 53 1.41 NaN 4 4 Beatrix Parlett 48 6.69 NaN 5 5 Olimpia Guenther 36 4.62 7.48 6 6 Grange Douce 40 1.01 4.37 7 7 Sallee Johnstone 34 4.88 NaN
Finalmente se puede asignar un ídice a los datos
df = pd.read_csv('example.csv', skiprows=1, names=['UID', 'First Name', 'Last Name', 'Age', 'Sales #1', 'Sales #2'], na_values=['?'], index_col='UID') df
First Name Last Name Age Sales #1 Sales #2 UID 0 Sigrid Mannock 27 7.17 8.06 1 Joe Hinners 31 1.90 NaN 2 Theodoric Rivers 36 1.11 5.90 3 Kennedy Donnell 53 1.41 NaN 4 Beatrix Parlett 48 6.69 NaN 5 Olimpia Guenther 36 4.62 7.48 6 Grange Douce 40 1.01 4.37 7 Sallee Johnstone 34 4.88 NaN
O más de uno
df = pd.read_csv('example.csv', skiprows=1, names=['UID', 'First Name', 'Last Name', 'Age', 'Sales #1', 'Sales #2'], na_values=['?'], index_col=['First Name', 'Last Name'])
Conclusiones
En esta entrada se ha explicado cómo guardar y leer archivos CSV en Python. Conocer los métodos de pandas que permiten realizar esta tarea con es clave para poder trabajar con estos archivos tan populares.
Miguel dice
Muy claro, muchas gracias!