Seaborn визуализировать сгруппированные частоты - PullRequest
1 голос
/ 17 апреля 2020

У меня есть DataFrame с start_time в правильном формате даты и времени и start_station_name в виде строки, которая выглядит следующим образом:

    start_time                      start_station_name
2019-03-20 11:04:16     San Francisco Caltrain (Townsend St at 4th St)
2019-04-06 14:19:06     Folsom St at 9th St
2019-05-24 17:21:11     Golden Gate Ave at Hyde St
2019-03-27 18:53:27     4th St at Mission Bay Blvd S
2019-04-16 08:45:16     Esprit Park

Теперь я хотел бы просто нанести частоту каждого имени на год в месяцах. Чтобы сгруппировать данные соответственно, я использовал это:

data = df_clean.groupby(df_clean['start_time'].dt.strftime('%B'))['start_station_name'].value_counts()

Затем я получаю что-то, что не является DataFrame, но представлено как dtype: int64:

start_time  start_station_name                                       
April       San Francisco Caltrain Station 2  (Townsend St at 4th St)    4866
            Market St at 10th St                                         4609
            San Francisco Ferry Building (Harry Bridges Plaza)           4270
            Berry St at 4th St                                           3994
            Montgomery St BART Station (Market St at 2nd St)             3550
                                                                         ... 
September   Mission Bay Kids Park                                        1026
            11th St at Natoma St                                         1023
            Victoria Manalo Draves Park                                  1018
            Davis St at Jackson St                                       1015
            San Francisco Caltrain Station (King St at 4th St)           1014

Теперь я хотел бы чтобы просто построить ее в виде кластеризованной гистограммы, используя countplot() Seaborn, только для абсолютной частоты выше 1000, где ось x представляет месяц, оттенок - это имя, а ось y должна отображать значения:

sns.countplot(data = data[data > 1000], x = 'start_time', hue = 'start_station_name')

Затем я получаю сообщение об ошибке Could not interpret input 'start_time', вероятно, потому что это неправильный DataFrame. Как я могу сгруппировать / сгруппировать его, чтобы визуализация работала?

1 Ответ

2 голосов
/ 17 апреля 2020

Попробуйте:

data = df.groupby([df['start_time'].dt.strftime('%B'), 'start_station_name']) \
        .count() \
        .rename(columns={"start_time": "count"}) \
        .reset_index()
ax = sns.countplot(x="start_time", hue="start_station_name", data=data[data.count > 1000])

Пояснения :

  • Я изменяю ключ в группе путем добавления столбцов start_station_name.
  • Используйте count, чтобы получить количество ячеек
  • Переименуйте столбец count в count, используя rename
  • Сброс индекса с groupby с использованием reset_index
  • Подмножество данных
  • Построение результата с использованием countplot ( используя второй пример из do c).

Полный код

print(df)
#            start_time                              start_station_name
# 0 2019-03-20 11:04:16  San Francisco Caltrain (Townsend St at 4th St)
# 1 2019-04-06 14:19:06                             Folsom St at 9th St
# 2 2019-05-24 17:21:11                      Golden Gate Ave at Hyde St
# 3 2019-03-27 18:53:27                    4th St at Mission Bay Blvd S
# 4 2019-04-16 08:45:16                                     Esprit Park

data = df.groupby([df['start_time'].dt.strftime('%B'), 'start_station_name']) \
        .count() \
        .rename(columns={"start_time": "count"}) \
        .reset_index()
print(data)
#   start_time                              start_station_name  count
# 0      April                                     Esprit Park      1
# 1      April                             Folsom St at 9th St      1
# 2      March                    4th St at Mission Bay Blvd S      1
# 3      March  San Francisco Caltrain (Townsend St at 4th St)      1
# 4        May                      Golden Gate Ave at Hyde St      1

# Filter as you desired
# data = data[data.count > 1000]

# Plot
ax = sns.countplot(x="start_time", hue="start_station_name", data=data)
plt.show()

output

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...