Python大数据集下for循环运行优化:Pandas行ID匹配效率提升方案
优化方案
核心问题说明
原有代码慢是因为使用了Python原生逐行遍历,Pandas对象的循环索引开销极大,同时还有链式赋值的潜在风险(df['flag'][ind] = 1 这种写法可能触发SettingWithCopyWarning)。
推荐优化实现
方案1:列表推导式(性能最优,实现简单)
直接对两列的元素配对遍历,跳过Pandas内部的额外封装开销,性能比原生循环高10~100倍(依数据量而定):
df['flag'] = [1 if aid in alist else 0 for aid, alist in zip(df['id'], df['list_of_approved_id'])]
方案2:向量化apply写法(可读性更高)
符合Pandas的常用写法,代码可读性更强,性能略低于列表推导式,但远高于原生循环:
df['flag'] = df.apply(lambda x: 1 if x['id'] in x['list_of_approved_id'] else 0, axis=1)
极致性能优化(适用于list_of_approved_id单列表长度大的场景)
如果list_of_approved_id列每个列表的元素很多,可提前将列表转为集合,把in操作的时间复杂度从O(n)降到O(1),进一步大幅提升速度:
# 先把审批id列表转为集合 df['set_of_approved_id'] = df['list_of_approved_id'].apply(set) # 再判断存在性 df['flag'] = [1 if aid in aset else 0 for aid, aset in zip(df['id'], df['set_of_approved_id'])] # 不需要保留集合列可直接删除 df.drop('set_of_approved_id', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者Hugo Wolf
相关产品推荐
相关产品推荐

