Entonces tengo datos que están estructurados de una manera un poco inusual. Aquí hay un ejemplo de lo que estoy trabajando:

import numpy as np
import pandas as pd

dict = {'data': [[1,2,3], [2,3,4], [3,4,5]], 'parameter': [10, 11, 12]}
df = pd.DataFrame(dict)

En otras palabras, cada fila en df['data'] contiene una matriz.

Necesito trazar esto usando la función imshow() de matplotlib, pero tengo dificultades para trabajar con las matrices en df['data']. Intenté usar df['data'].to_numpy(), pero esto devuelve un dtype=object, que imshow no puede manejar. Recibo este error al intentar trazarlo:

TypeError: los datos de imagen del objeto dtype no se pueden convertir en flotante

Para ser exactos, esto es lo que he intentado ejecutar:

import pylab as plt
plt.imshow(df['data'].to_numpy())

He leído y parece que no puedo encontrar a nadie con un ejemplo similar.

Para ser claros: necesito ir desde el DataFrame a imshow, no puedo trazar directamente desde el diccionario en mi código. Tampoco quiero agregar nada a nuevas listas, ya que mi conjunto de datos es grande y ralentizará considerablemente las cosas.


EDITAR 1:

Para responder una pregunta en los comentarios, este es el tipo de trama que busco. El eje x contiene las matrices en df['data'], mientras que el eje y finalmente será df['parameter']. ingrese la descripción de la imagen aquí


EDITAR 2:

Creo que necesito aclarar más mi pregunta. Estoy buscando reproducir esta trama exactamente.

enter image description here

Para hacer esta trama, hice lo siguiente:

rows = []
for i in df['data']: 
    rows.append(i)
plt.imshow(rows)

Esta solución funciona con mis datos, pero estoy buscando una forma más eficiente de hacer lo mismo. es decir, un método que no implica repetir y agregar.

1
NoVa 22 ene. 2021 a las 10:20

1 respuesta

La mejor respuesta

Podría hacer lo siguiente:

Use df.explode para anular la lista de la columna data en diferentes filas y luego trazar.

x = df.explode('data').reset_index()
plt.imshow(x[['data','parameter']].to_numpy().astype('float').T)

Esto producirá:

enter image description here

Básicamente, x[['data','parameter']].to_numpy().astype('float').T le dará la matriz numérica deseada donde puede trazar como desee.

Editar según el comentario del usuario:

plt.imshow(np.array(df["data"].values.tolist()).astype('float'))

Esto producirá:

enter image description here

1
David S 22 ene. 2021 a las 08:16