#python #pandas #seaborn
#python #панды #сиборн
Вопрос:
У меня есть фрейм данных с двумя столбцами, первый может иметь целое число от 0-15, другой может иметь целое число от 0-10.
В df примерно 10 000 строк.
Я хочу построить какую-то сетку (15×10), которая может визуально представлять, сколько экземпляров каждой комбинации у меня есть во всем фрейме данных, в идеале отображая фактическое число в каждой ячейке сетки.
Я пробовал как Seaborn, так и Matplotlib.
В Seaborn я попробовал jointplot
, который почти сделал это, но я не могу заставить его отображать фактическую сетку 15×10. Я также попробовал heatmap
, но он выдал мне ошибку (см. Ниже), и я ничего не смог найти на нем.
Я также попытался построить какую-то 3D-гистограмму.
Наконец, я попытался повернуть данные, но Pandas вычисляет числа как значения, а не рассматривает их как «сегменты».
Не уверен, куда идти дальше.
*heatmap error: "ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''"
sns.heatmap(x='pressure_bucket', y='rate_bucket', data=df)
Ближе всего к тому, что я хочу, это что-то вроде этого, в идеале с фактическими числами в каждой ячейке
Заранее спасибо всем!
Ответ №1:
Мы можем использовать plt.imshow
для отображения тепловой карты,
# get the counts in form of a dataframe indexed by (c1,c2)
counts = df.groupby(['c1'])['c2'].value_counts().rename('value').reset_index()
# pivot to c1 as index, c2 as columns
counts = counts.pivot(index='c1', columns='c2', values='value')
# after reading your question carefully, there's another step
# fill all missing value in c1
counts.reindex(range(16))
# fill all missing value in c2
counts = counts.reindex(range(10), axis=1)
# fill all missing values with 0
counts = counts.fillna(0)
# imshow
plt.figure(figsize=(15,10))
plt.imshow(counts, cmap='hot')
plt.grid(False)
plt.show()
# sns would give a color bar legend
plt.figure(figsize=(15,10))
sns.heatmap(counts, cmap='hot')
plt.show()
Вывод (случайные записи)
Вывод sns:
Комментарии:
1. Эй, Куанг, прежде всего, спасибо за ваш ответ, я чувствую, что я намного ближе, чем был! Однако я все еще борюсь с этим графиком, когда я показываю «count», он показывает все 0, и когда я показываю графики, они сильно отличаются от ваших. Пожалуйста, проверьте это изображение с некоторыми скриншотами того, где я нахожусь, еще раз спасибо! imgur.com/a/jcpp3BU
2. Похоже, вы этого не сделали
counts = counts.pivot(index='c1', columns='c2', values='value')
. Но все же это кажется неправильным. можете ли вы распечатать заголовок:df[['pressure_bucket', 'rate_bucket']].head(20)
и посмотреть, соответствуют ли значения вашим ожиданиям?3. Да, начало и конец фрейма данных показывают разумные данные в пределах диапазона, который я ожидал. Все еще не уверен, почему тепловая карта не отображается. Еще раз спасибо imgur.com/a/i7JBEDF
4. @adrian Я просто перепроверяю, вы забыли вторую строку ответа. Я отбросил эту строку и получил те же изображения, что и вы.
5. Ты абсолютно прав, Куанг, совершенно забыл об этом, теперь работает как шарм, спасибо! imgur.com/a/bNuBEiT