【发布时间】:2018-12-10 18:22:17
【问题描述】:
我有一个如下所示的数据框
我想知道是否存在一种最快的方法来在 pandas 中创建一个可以保存如下数据的 python dict
table = {2: [4, 5, 6, 7, 8 ...], 4: [1, 2, 3, 4, ...]}
这里的键是用户 ID,值是唯一的日期列表。
这可以在核心 python 的早期完成,但想知道是否有基于 pandas 或 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 ms ± 58.8 µs(平均值 ± 标准偏差,7 次运行,每次 100 个循环)
a = {k: list(set(list(zip(*g))[1]))
for k, g in groupby(res.index.values.tolist(), itemgetter(0))}
【问题讨论】:
-
是否可以为纯 python 解决方案添加计时?
-
我认为
Brad Solomon解决方案和我的第一个,我真的很好奇是否更快。谢谢。 -
@jezrael 已在问题中更新。
标签: python pandas numpy dataframe indexing