如何高效遍历Pandas DataFrame?Python新手求优化方案
高效遍历/处理DataFrame元素的优化方案
嘿,作为Python新手能自己动手实现需求已经超棒了!不过你当前用iterrows()嵌套iteritems()的写法,在处理中等或较大规模的DataFrame时效率会比较拉胯——因为这两个方法本质上是在Python层面逐行、逐元素遍历,每次迭代都有不少额外开销,嵌套循环更是让效率雪上加霜。
最优方案:用Pandas向量化操作替代循环
Pandas的核心优势就是向量化计算,底层是用C实现的,速度比Python循环快好几个量级。你的需求是把每行的每个元素除以该行的总和,完全可以用一行向量化代码搞定:
import pandas as pd # 直接生成结果,无需手动循环 weights = histCaps.div(histCaps.sum(axis=1), axis=0)
代码解释:
histCaps.sum(axis=1):计算DataFrame每行的总和(axis=1代表按行求和)div()方法:指定axis=0,让每行的每个元素都除以对应的行总和,自动完成所有元素的计算,全程没有Python级别的循环
如果你确实需要遍历(不推荐此场景)
如果某些特殊场景下必须遍历,也别用iterrows(),换成itertuples()会更高效——它返回的是命名元组,比iterrows()返回的Series对象开销小很多:
weights = histCaps.copy() # 先提前计算好所有行的总和,避免循环里重复计算浪费资源 row_sums = histCaps.sum(axis=1) for row in histCaps.itertuples(): idx = row.Index for col in histCaps.columns: # 用at[]访问元素比loc[]更高效,适合单个元素赋值 weights.at[idx, col] = getattr(row, col) / row_sums[idx]
但还是要再强调:能不用循环就不用循环,向量化操作永远是Pandas处理数据的最优选择!
内容的提问来源于stack exchange,提问作者Vasiliy
相关产品推荐
相关产品推荐

