Pandas: как получить строки с максимальным значением value_count для группировки столбцов по другому столбцу в качестве фрейма данных

#python #pandas #dataframe

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

Вопрос:

У меня есть три столбца в фрейме данных pandas, Date , Hour и Content . Я хочу получить час в день, когда в этот день содержится наибольшее количество контента.Я использую messages.groupby(["Date", "Hour"]).Content.count().groupby(level=0).tail(1) . Я не знаю, что groupby(level=0) здесь делается. Выводится следующим образом-

 Date        Hour
2018-04-12  23       4
2018-04-13  21      43
2018-04-14  9        1
2018-04-15  23      29
2018-04-16  17       1
                    ..
2020-04-23  20       1
2020-04-24  22       1
2020-04-25  20       1
2020-04-26  23      32
2020-04-27  23       3
  

Это объект серии pandas, и мои желаемые Date Hour столбцы и находятся MultiIndex здесь. Если я попытаюсь преобразовать MultiIndex объект в фрейм данных, используя pd.DataFrame(most_active.index) , most_active будучи результатом предыдущего кода, он создает фрейм данных из кортежей, как показано ниже-

                     0
0    (2018-04-12, 23)
1    (2018-04-13, 21)
2     (2018-04-14, 9)
3    (2018-04-15, 23)
4    (2018-04-16, 17)
..                ...
701  (2020-04-23, 20)
702  (2020-04-24, 22)
703  (2020-04-25, 20)
704  (2020-04-26, 23)
705  (2020-04-27, 23)
  

Но мне нужны два отдельных столбца Date и Hour . Каков наилучший способ для этого?

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

1. Если вы не указываете имена столбцов в groupby методе, вам нужно будет указать значение level параметра, которое является уровнем вашего индекса фрейма данных. Если вы выполняете код, подобный тому, который вы сделали ( level=0 ) , я думаю, вы будете группировать только по дате, если у вас есть многоиндексный фрейм данных с датой уровня 0. Кроме того, если вы хотите работать tail(1) в groupby, убедитесь sort_values() , что сначала.

Ответ №1:

Редактировать, потому что я неправильно понял ваш вопрос

Во-первых, вы должны подсчитать общее содержимое по дате-часу, как и вы:

 df = messages.groupby(["Date", "Hour"], as_index=False).Content.count()
  

Здесь я оставил группы в их исходных столбцах, передав параметр as_index=False .

Затем вы можете запустить приведенный ниже код, приведенный в исходном ответе:

Предположим, у вас есть уникальные идентификаторы индексов (если нет, просто сделайте df.reset_index(inplace=True) ), вы можете использовать idxmax метод in groupby . Он вернет индекс с наибольшим значением для каждой группы, после чего вы сможете использовать их для нарезки фрейма данных.

Например:

 df.loc[df.groupby(['Date', 'Hour'])['Content'].idxmax()]
  

В качестве альтернативы (без использования groupby) вы можете сначала отсортировать значения в порядке убывания, чтобы удалить дубликаты даты и времени:

 df.sort_values('Content', ascending=False).drop_duplicates(subset=['Date', 'Hour'])
  

Наконец, вы получаете MultiIndex с set_index() помощью метода:

 df.set_index(['Date','Hour'])
  

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

1. Я ценю вашу помощь, но ни один из них не работает должным образом, ваш второй код пытается отсортировать по Content строковому полю, а первый код выдает a ValueError и ничего больше. Возможно, я не указал это четко в своем вопросе.

2. На самом деле, я неправильно понял ваш вопрос. Я отредактировал ответ, добавив первый фрагмент, чтобы получить количество (как и вы), затем последний, чтобы получить MultiIndex . Пожалуйста, дайте мне знать, если это работает.