如何优化通过dataframe.loc操作向列表追加数据的运行速度
问题分析与优化方案
原来的代码耗时高的核心原因是存在O(n²)的时间复杂度:你遍历每一行的时候,都对整个DataFrame做了一次全表匹配查找df.name==i,2万行数据就要执行2万次全表扫描,自然耗时极高。
你可以直接用pandas内置的向量化操作实现需求,完全不需要自己写循环,以下是两种可直接使用的实现:
- 方案1:使用
drop_duplicates(最简洁,性能最优)drop_duplicates默认保留每个唯一值的第一个出现项,直接取对应索引即可:
# 直接得到每个唯一name首次出现的索引列表 mylist = df.drop_duplicates(subset='name', keep='first').index.tolist() # 如果需要集合格式,直接套set()即可 # mylist = set(mylist)
- 方案2:使用
groupby + head(适合需要同步做其他分组计算的场景)
如果后续还要对每个name分组做其他统计,可以用这个方法同步获取首次出现行的索引:
mylist = df.groupby('name', group_keys=False).head(1).index.tolist()
两种方案在2万行的数据集上运行时间都不会超过10毫秒,相比原来的写法性能提升至少600倍。
内容的提问来源于stack exchange,提问作者Elgun Valiyev
相关产品推荐
相关产品推荐

