У меня есть pandas фрейм данных df
с индексом типа DatetimeIndex
с параметрами: dtype='datetime64[ns]', name='DateTime', length=324336, freq=None
. Фрейм данных имеет 22 столбца, все числовые. Я хочу создать новый столбец Date
только с частью даты DateTime
(которая будет использоваться для группировки позже).
Моя первая попытка
df['Date'] = df.apply(lambda row: row.name.date(), axis=1)
занимает ок. 13,5 секунд. Но когда я делаю DateTime
обычным столбцом, он работает быстрее, даже с учетом операций с индексами:
df.reset_index(inplace=True)
df['Date'] = df.apply(lambda row: row['DateTime'].date(), axis=1)
df.set_index('DateTime')
Это занимает около. 6,3 с, т.е. это в два раза быстрее. Кроме того, применение apply
непосредственно к серии (поскольку оно зависит только от одного столбца) еще быстрее:
df.reset_index(inplace=True)
df['Date'] = df['DateTime'].apply(lambda dt: dt.date())
df.set_index('DateTime')
занимает ок. 1,1 с, более чем в 10 раз быстрее, чем исходное решение.
Это подводит меня к моим вопросам:
- Применяет ли
apply
к серии в целом быстрее, чем к фрейм данных? - Использование
apply
в индексе обычно медленнее, чем в столбцах? - В более общем смысле: в чем преимущество сохранения столбца в качестве индекса? Или, наоборот, что бы я потерял, сбросив индекс перед выполнением каких-либо операций?
- Наконец, есть ли еще лучший / более быстрый способ добавления столбца?