У меня большой фрейм данных (~ 40 миллионов строк), и я хочу разделить его на две части.Столбец 'group'
указывает, к какой группе относится образец, а в столбце 'date'
- какая дата выборки.В следующем тестовом примере может быть несколько одинаковых выборок, но в исходном наборе это не так.Далее в исходных данных есть три столбца.Теперь, если самая поздняя дата одной группы старше или равна '2017-01-30'
, я хочу установить для всей группы значение s1
, в противном случае - s2
.
Приведенный ниже код делает то, что должен, ноэто очень медленно.У вас есть идея, как я могу ускорить процесс?Знаете ли вы, почему этот подход такой медленный?Линия df['split'] = grouped['date'].transform(lambda x: x.max() < date_)
является узким местом.Спасибо за вашу помощь.
from random import randint
import numpy as np
import time
import pandas as pd
length = int(1e5)
bimonthly_days = np.arange(0, 30)
base_date = np.datetime64('2017-01-01')
random_date = base_date + np.random.choice(bimonthly_days)
groups = np.random.randint(1, int(2e4), length)
dates = np.array([base_date + np.random.choice(bimonthly_days) for _ in range(length)], dtype='datetime64[ns]')
df = pd.DataFrame({'group': groups, 'date': dates})
grouped = df.groupby('group')
date_ = np.datetime64('2017-01-30')
start_time = time.process_time()
df['split'] = grouped['date'].transform(lambda x: x.max() < date_)
dif = time.process_time() - start_time
print(f" elapsed time: {dif}")
s1 = df[df['split'] == 1].drop(columns=['split'])
s2 = df[df['split'] == 0].drop(columns=['split'])
Вывод:
elapsed time: 12.923806