Я пытаюсь сгруппировать по двум факторам в длинные (> 2M) строки.
Справочная информация
Второй фактор, по сути, является датой тестирования - для данного образца (первой группы) образец может быть повторно протестирован.
Однако тест может изменить образец, поэтому полезно иметь возможность выборочно извлекать партию тестовых данных из второго теста (или третьего, четвертого и т. Д.)
Предыдущий вопрос и текущий код
Я задал вопрос некоторое время назад и попал куда-то с функцией, большое спасибо Правине :
Сортировка и ранжирование по датам, по группе в пандах df
но это невероятно медленно: работает на наборе данных строки 1.2M, до сих пор он занимал более 20 минут на сервере JupyterHub с оперативной памятью 96 ГБ и продолжает работать.
df1 = df.sort_values(['id', 'date'], ascending=[True, False])
df1['date_rank'] = df1.groupby(['id'])['date'].transform(lambda x: list(map(lambda y: dict(map(reversed, dict(enumerate(x.unique())).items()))[y]+1,x)) )
Текущая идея
Вместо того, чтобы обозначать даты испытаний цифрой, как я и думал, похоже, что это близко к достижимости с помощью cumcount, groupby.nth или getgroup - но я не могу туда добраться. У кого-нибудь есть идеи?
Приведенный ниже набор данных по-прежнему актуален:
df = pd.DataFrame({
'id':[1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,6,6,7,7],
'value':[.01, .4, .5, .7, .77, .1,.2, 0.3, .11, .21, .4, .01, 3, .5, .8, .9, .1],
'date':['10/01/2017 15:45:00','10/01/2017 15:45:00','05/01/2017 15:56:00',
'11/01/2017 15:22:00','11/01/2017 15:22:00','06/01/2017 11:02:00','05/01/2017 09:37:00','05/01/2017 09:37:00','05/01/2017 09:55:00',
'05/01/2017 09:55:00','05/01/2017 10:08:00','05/01/2017 10:09:00','03/02/2017 08:55:00',
'03/02/2017 09:15:00','03/02/2017 09:31:00','09/01/2017 15:42:00',
'19/01/2017 16:34:00']})
И я пытаюсь сгенерировать такие данные в столбце date_rank; хотя я рад, что не генерирую столбец, я просто хочу иметь возможность выбирать строки, содержащие данные второй даты тестирования.
Например:
df.groupby(['id','date'])['value'].unique()
Возвращает:
id date
1 05/01/2017 15:56:00 [0.5]
10/01/2017 15:45:00 [0.01, 0.4]
2 11/01/2017 15:22:00 [0.7, 0.77]
3 05/01/2017 09:37:00 [0.2, 0.3]
06/01/2017 11:02:00 [0.1]
4 05/01/2017 09:55:00 [0.11, 0.21]
5 05/01/2017 10:08:00 [0.4]
05/01/2017 10:09:00 [0.01]
6 03/02/2017 08:55:00 [3.0]
03/02/2017 09:15:00 [0.5]
03/02/2017 09:31:00 [0.8]
7 09/01/2017 15:42:00 [0.9]
19/01/2017 16:34:00 [0.1]
Я бы хотел иметь возможность выбрать (например) вторую группу из группы , где это возможно например ::101036
1 - 10/01/2017 15:45:00 [0.01, 0.04]
3 - 06/01/2017 11:02:00 [0.1]
5 - 05/01/2017 10:09:00 [0.01]
6 - 03/02/2017 09:15:00 [0.5]
Любая помощь или мысли с благодарностью.