Столбец Pandas состоит из массивов, отобразите это с помощью plt.imshow()

#python #pandas #dataframe #matplotlib #imshow

#python #pandas #фрейм данных #matplotlib #imshow

Вопрос:

Итак, у меня есть данные, которые структурированы немного необычным образом. Вот пример того, с чем я работаю:

 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)
 

Другими словами, каждая строка df['data'] содержит массив.

Мне нужно построить это с помощью imshow() функции matplotlib, но у меня возникают трудности при работе с массивами df['data'] . Я пробовал использовать df['data'].to_numpy() , но это возвращает a dtype=object , который imshow не может обработать. Я получаю эту ошибку при попытке ее построения:

Ошибка типа: данные изображения объекта dtype не могут быть преобразованы в float

Если быть точным, это то, что я пытался запустить:

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

Я прочитал и, похоже, не могу найти никого с подобным примером.

Чтобы было ясно: мне нужно перейти от фрейма данных к imshow, я не могу построить график непосредственно из словаря в моем коде. Я также не хочу добавлять какие-либо добавления к новым спискам, так как мой набор данных большой и значительно замедлит работу.


РЕДАКТИРОВАТЬ 1:

Чтобы ответить на вопрос в комментариях, это тот тип графика, который мне нужен. Ось x содержит массивы df['data'] , в то время как ось y в конечном итоге будет df['parameter'] . введите описание изображения здесь


РЕДАКТИРОВАТЬ 2:

Я думаю, мне нужно дополнительно уточнить свой вопрос. Я хочу точно воспроизвести этот график.

введите описание изображения здесь

Чтобы создать этот график, я сделал следующее:

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

Это решение работает с моими данными, но я ищу более эффективный способ сделать то же самое. т. Е. Метод, который не включает в себя цикл и добавление.

Комментарии:

1. Какой график вы хотите? просто постройте его как квадратную матрицу? может ли быть так, что некоторые списки будут иметь разные размеры?

2. @DavidS, я добавил редактирование. Дайте мне знать, если это прояснит мою цель.

3. состоит ли ось x из сплющенного массива из df['data']? , если да, состоит ли диапазон из диапазона значений для сплющенного массива из всего df['data'] столбца()?

4. @theSekyi, ось x в точности соответствует тому, что я изложил выше. т. Е., y=df['parameter'][0] и x=df['data'][0] , где x и y — значения оси x и оси y соответственно.

Ответ №1:

Вы могли бы сделать следующее:

используйте df.explode , чтобы отменить перечисление data столбца в разные строки, а затем отобразить.

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

Это приведет к:

введите описание изображения здесь

По сути, x[['data','parameter']].to_numpy().astype('float').T это даст вам желаемый массив numpy, в котором вы можете отображать по своему усмотрению.

Редактировать на основе комментария пользователя:

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

Это приведет к:

введите описание изображения здесь

Комментарии:

1. Это хорошее решение, но не совсем то, что мне нужно. Пожалуйста, посмотрите мое последнее редактирование.

2. @NoVa так ты не хочешь использовать parameter ?

3. Я делаю, но для простоты скажем, нет.

4. Я только добавил его в свой первый пример, чтобы лучше реплицировать мои данные. parameter на самом деле это будет просто y-метка, она не влияет на построение графика вне этого.

5. хм… Я получаю эту ошибку: TypeError: Image data of dtype object cannot be converted to float . Эта строка кода правильно извлекает массивы, но я все еще остаюсь с этой исходной ошибкой.