gpt4 book ai didi

python - 如何获取多索引数据框前两个索引的字典

转载 作者:太空狗 更新时间:2023-10-29 21:35:57 26 4
gpt4 key购买 nike

我有一个如下所示的数据框

enter image description here

我想知道是否存在一种最快的方法来在 pandas 中创建一个 python 字典来保存如下数据

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 毫秒 ± 58.8 微秒(7 次运行的平均值 ± 标准偏差,每次 100 次循环)

a = {k: list(set(list(zip(*g))[1])) 
for k, g in groupby(res.index.values.tolist(), itemgetter(0))}

最佳答案

这是一个使用 drop_duplicates + groupby 的解决方案。

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)

{1: [2, 3], 2: [8, 9]}

设置

df = pd.DataFrame([[1, 2, 0, 3], [1, 2, 1, 4], [1, 3, 1, 5],
[2, 8, 1, 3], [2, 8, 1, 4], [2, 9, 2, 5]],
columns=['col1', 'col2', 'col3', 'col4'])

df = df.set_index(['col1', 'col2', 'col3'])

print(df)

col4
col1 col2 col3
1 2 0 3
1 4
3 1 5
2 8 1 3
1 4
9 2 5

关于python - 如何获取多索引数据框前两个索引的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51137594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com