Существует несколько простых упрощений, которые вы можете рассмотреть.
Одним из них является то, что вы можете вызывать max()
непосредственно для объекта GroupBy, вам не нужен причудливый индекс для всех столбцов, так как это то, что он возвращает по умолчанию:
df = df.groupby('date').max()
Во-вторых, вы можете отключить сортировку GroupBy. Как указано в Pandas для groupby()
:
sort : bool, по умолчанию True
Сортировка групповых ключей. Повысьте эту производительность, отключив ее. Обратите внимание, что это не влияет на порядок наблюдений в каждой группе. Groupby сохраняет порядок строк в каждой группе.
Так что попробуйте также:
df = df.groupby('date', sort=False).max()
В-третьих, вы также можете использовать простой pivot_table()
для создания тот же результат.
df = df.pivot_table(index='date', aggfunc='max')
Еще один подход - возврат к вашему DataFrame "действиям", превращение его в MultiIndex и использование его для простой серии, затем использование unstack()
для него, которое должно получить результат тот же, без необходимости использовать шаг get_dummies()
(но не уверен, удалит ли это некоторые свойства разреженности, на которые вы в настоящее время полагаетесь.)
actions_df = pd.DataFrame(data, columns = ['date', 'action'])
actions_index = pd.MultiIndex.from_frame(actions_df, names=['date', ''])
actions_series = pd.Series(1, index=actions_index)
df = actions_series.unstack(fill_value=0)
Ваш предоставленный образец DataFrame вполне полезно для проверки того, что все они эквивалентны и дают один и тот же результат, но, к сожалению, не так уж хороши для его сравнения ... Я предлагаю вам взять больший набор данных (но все же меньше, чем ваши реальные данные, например, в 10 раз меньше или, возможно, в 40-50 раз меньше). ), а затем выполните тестирование операций, чтобы проверить, сколько времени они занимают.
Если вы используете Jupyter (или другую оболочку I Python), вы можете использовать * 10 40 * команда для сравнения выражения.
Таким образом, вы можете ввести:
%timeit df.groupby('date').max()
%timeit df.groupby('date', sort=False).max()
%timeit df.pivot_table(index='date', aggfunc='max')
%timeit actions_series.unstack(fill_value=0)
и сравнить результаты, затем увеличить масштаб и проверить, будет ли весь цикл завершен за приемлемое количество времени.