#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
. Эта строка кода правильно извлекает массивы, но я все еще остаюсь с этой исходной ошибкой.