У меня есть фрейм данных, который выглядит следующим образом
![enter image description here](https://i.stack.imgur.com/JOtOC.png)
Мне было интересно, существует ли самый быстрый способ создания диктата Python в пандах, который бы содержал данные, подобные следующим
table = {2: [4, 5, 6, 7, 8 ...], 4: [1, 2, 3, 4, ...]}
Здесь ключи - идентификаторы пользователей, а значения - уникальный список дат.
Это можно было сделать на ранних стадиях ядра Python, но мне было интересно, есть ли способ для быстрого вычисления, основанный на пандах или numpy. Мне нужно было быстрое решение, которое хорошо масштабируется, когда этот фрейм данных увеличивается.
Редактировать 1: Спектакли
Время: 14,3 мс ± 134 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 100 циклов в каждом)
levels = pd.DataFrame({k: df.index.get_level_values(k) for k in range(2)})
table = levels.drop_duplicates()\
.groupby(0)[1].apply(list)\
.to_dict()
print(table)
Время выполнения: 17,4 мс ± 105 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 100 циклов в каждом)
res.reset_index().drop_duplicates(['user_id','date']).groupby('user_id')['date'].apply(list).to_dict()
принятое время: 294 мс ± 12,8 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)
a = {k: list(pd.unique(list(zip(*g))[1]))
for k, g in groupby(df.index.values.tolist(), itemgetter(0))}
print (a)
Время съемки: 15 мс ± 187 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 100 циклов в каждом)
pd.Series(res.index.get_level_values(1), index=res.index.get_level_values(0)).groupby(level=0).apply(set).to_dict()
Редактировать 2: Бенчмаркинг снова
Неверный результат
idx = df.index.droplevel(-1).drop_duplicates()
l1, l2 = idx.levels
mapping = defaultdict(list)
for i, j in zip(l1, l2):
mapping[i].append(j)
Улучшенное время: 14,6 мс ± 58,8 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 100 циклов каждый)
a = {k: list(set(list(zip(*g))[1]))
for k, g in groupby(res.index.values.tolist(), itemgetter(0))}