#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
строковому полю, а первый код выдает aValueError
и ничего больше. Возможно, я не указал это четко в своем вопросе.2. На самом деле, я неправильно понял ваш вопрос. Я отредактировал ответ, добавив первый фрагмент, чтобы получить количество (как и вы), затем последний, чтобы получить
MultiIndex
. Пожалуйста, дайте мне знать, если это работает.