Como utilizar ficheros CSV con pandas (Python)

Photo by Nick Hillier on Unsplash

Hoy en la Buhardilla vamos a ver como podemos trabajar con los ficheros CSV, usando la librería (de Python) pandas. Algunas veces cuando se trabaja con sensores o con automatización de algunos procesos, los datos de los mismos son almacenados en ficheros CSV. La ventaja de esta clase de ficheros es que son ligeros y pueden almacenar gran cantidad de información. El problema es que no siempre almacenan los datos de la mejor manera posible para la comprensión humana o para poder gratificar los datos de los sensores. Por esta razón hoy en la Buhardilla vamos a ver como podemos trabajar con dichos ficheros para adecuarlos a nuestras necesidades. Sin más dilación empecemos.

Algunas veces es posible que nos encontremos que la información que queremos utilizar esta con el siguiente formato (imaginemos que tenemos tres sensores):

TiempoValor
Tiempo 1Valor sensor 1
Tiempo 1Valor sensor 2
Tiempo 1Valor sensor 3
Tiempo 2Valor sensor 1
Tiempo 2Valor sensor 2
Tiempo 2Valor sensor 3
Tabla 1: Fichero original desordenado

Como vemos aquí, tenemos una fila para cada valor de sensor y para cada tiempo, es decir tenemos tres filas con el mimo valor de tiempo y una única columna que muestra todos los valores. Si bien es cierto que tenemos toda la información que nos hace falta almacenada en el fichero, también lo es que esta no está organizada de la mejor manera posible para su interpretación. La manera más lógica seria:

Sensor 1Sensor 2Sensor 3
Tiempo 1Valor sensor 1Valor sensor 2Valor sensor 3
Tiempo 2Valor sensor 1Valor sensor 2Valor sensor 3
Tabla 2: Fichero modificado con los valores ordenados

Como se puede ver, ordenando los datos de esta manera es mucho más fácil poder ver como van variando los datos con el tiempo e incluso es mucho más fácil de representarlos gráficamente. A continuación veremos el código de Python que nos va a permitir organizar los datos en el formato de la tabla uno a los mostrados en la tabla 2.

import pandas as pd
from pandas import ExcelWriter

df = pd.read_csv('registro.csv', delimiter=';')
df = df.groupby(['Variable', 'Tiempo'], as_index=False).sum()
variables = df['Variable'].unique()
tabla_final = pd.DataFrame(data=df['Tiempo'].unique(), columns=['Tiempo']).set_index('Tiempo')
for sensor in variables:
    nombre = sensor
    valores = df[df['Variable'] == sensor].set_index('Tiempo')
    valores = valores.drop(columns='Variable', axis=1)
    valores.rename({'Valor': nombre}, axis='columns', inplace=True)
    tabla_final = pd.concat([tabla_final, valores], axis=1, sort=True)
fichero_ordenado = ExcelWriter('registros.xlsx')
tabla_final.to_excel(fichero_ordenado)
fichero_ordenado.save()

Como es costumbre en los scripts de Python, en las primeras líneas importamos todos los módulos que vamos a utilizar. En este caso usaremos pandas que lo importamos como ‘pd’ (esto lo único que hace es renombrar el módulo que solo tengamos que escribir ‘pd’ en vez de pandas cada vez que queremos hacer una llamada al módulo). También importamos la función ‘ExcelWrite’ que nos permitirá almacenar la nueva tabla en un fichero Excel.

df = pd.read_csv('registro.csv', delimiter=';')
df = df.groupby(['Variable', 'Tiempo'], as_index=False).sum()
variables = df['Variable'].unique()
tabla_final = pd.DataFrame(data=df['Tiempo'].unique(), columns=['Tiempo']).set_index('Tiempo')

En la línea 4 creamos un dataframe (el formato que tiene pandas para tratar las tablas) a partir de la información del fichero ‘registros.cvs’, como que en este caso los valores están separados por ‘;’ lo indicamos en el parámetro delimiter. A continuación ordenamos el dataframe, primero por los valores de la columna ‘Variables’ y en el siguiente nivel lo hacemos por la columna ‘Tiempo’. Después de esto almacenamos todos los valores de las variables ‘únicas’ en ‘variables’ (más tarde lo vamos a usar). También aprovechamos para crear un nuevo dataframe (tabla_final) donde iremos añadiendo los distintos valores de los sensores, una vez procesados. Esta tabla tiene como valores de la primera columna los valores de los distintos instantes de tiempo.

for sensor in variables:
    nombre = sensor
    valores = df[df['Variable'] == sensor].set_index('Tiempo')
    valores = valores.drop(columns='Variable', axis=1)
    valores.rename({'Valor': nombre}, axis='columns', inplace=True)
    tabla_final = pd.concat([tabla_final, valores], axis=1, sort=True)

Una vez ya tenemos todas las tablas preparadas para almacenar los datos, es momento de empezar a ordenar la información. Para eso vamos a ir recopilando los datos para cada uno de los sensores. Para eso vamos a utilizar un bucle for. Lo primero que haremos será coger la columna del sensor correspondiente y ordenarlas por ‘Tiempo‘ de esta manera vamos a tener una tabla de dos dimensiones en que la primera columna corresponde a los valores de tiempo y la segunda corresponde a los valores del sensor en cuestión. Como que realmente solo estamos interesados en los valores del sensor eliminamos la primera columna (con la función drop) y también cambiamos el nombre de la columna por el nombre del sensor (línea 12). Finalmente añadimos este valor al dataframe tabla_final con la función concat (que simplemente nos va a unir las dos tablas (tabla_final y valores) en una). Este proceso se va a repetir tantas veces como sensores tengamos.

fichero_ordenado = ExcelWriter('registros.xlsx')
tabla_final.to_excel(fichero_ordenado)
fichero_ordenado.save()

Una vez ya tenemos todos los datos organizados como queremos es momento de almacenarlos en un fichero, para poder usarlos en otras aplicaciones. Es este caso he escogido el formato de ficheros Excel por ser uno de los más utilizados a la hora de representar gráficos y almacenar tablas. Para eso creamos el fichero donde lo vamos a almacenar, ‘registros.xlsx’ con la función ‘ExcelWriter’. En la línea siguiente almacenamos la tabla que queremos en el fichero que hemos creado, para finalmente guardar todos los cambios.

Con estos sencillos pasos hemos pasado de un fichero CSV que no podíamos utilizar a un fichero xlsx perfectamente ordenado y comprensible. Espero que esto os sirva de ayuda por si alguna vez os encontréis con algún problema similar y no dudéis de dejar en comentarios cualquier duda o aclaración que os haya surgido.

Saludos y hasta la próxima aventura.

Un comentario sobre “Como utilizar ficheros CSV con pandas (Python)

Agrega el tuyo

Deja un comentario

Blog de WordPress.com.

Subir ↑