无需循环从DataFrame生成指定分组结构字典的高效方法
最优实现方案
你原来的遍历唯一值再取子集的方法时间复杂度极高,每次取子集都会扫描全表,百万级唯一值场景下完全不可用,推荐以下两种高效实现:
方案1:pandas内置groupby(推荐绝大多数场景使用)
利用pandas底层C实现的分组能力,完全避免Python层循环,一行代码即可完成,性能是手动遍历的百倍以上:
import pandas as pd # 按ColA分组,将ColB的取值聚合为列表,最后转成字典 res = df.groupby("ColA")["ColB"].apply(list).to_dict()
运行上述代码,你给出的示例数据会得到结果:{'mike': [34, 3, 10], 'bill': [80], 'dean': [2, 4, 44, 56]},你问题描述里写的bill对应[10]属于笔误。
方案2:defaultdict遍历(超大数据量场景使用)
如果你的数据量超过千万行,使用Python原生的defaultdict单次遍历全表的性能会略高于groupby,仅需扫描全表一次:
from collections import defaultdict res = defaultdict(list) # 直接迭代两列的值,逐个追加到对应列表 for col_a, col_b in zip(df["ColA"], df["ColB"]): res[col_a].append(col_b) # 可选:如果需要转为普通字典 res = dict(res)
注意事项
如果ColB存在空值需要过滤,可以先提前清洗数据再处理:
# 先删除ColB为空的行 df = df.dropna(subset=["ColB"])
内容的提问来源于stack exchange,提问作者dmd7
相关产品推荐
相关产品推荐

