为何Pandas中循环计算可行而直接计算失效?
Pandas批量计算报错的原因及解决办法
为什么直接计算失效?
math.sqrt()是Python基础库的函数,只能处理单个浮点数,而你代码里b*b-4.0*a*(c-grid['Distance'])得到的是一个Pandas Series(一整列数据),把Series传给math.sqrt()自然会报错——它没法把一整列数据转成单个浮点数。
为什么移除sqrt后能运行?
Pandas本身支持向量式运算,加减乘除这些操作可以直接对整个Series批量处理,不需要逐个元素操作,所以去掉math.sqrt()后,剩下的运算都能正常批量执行(只是结果不对,因为少了开根号步骤)。
为什么循环可行但效率低?
循环里每次都取了Series的单个元素(grid['Distance'].iloc[i]),传给math.sqrt()的是单个浮点数,符合函数要求,所以能得到正确结果。但循环遍历DataFrame是效率最低的方式,数据量越大,运行速度越慢。
正确的高效实现方式
改用支持向量运算的工具,两种写法都能批量处理整列数据,效率和循环天差地别:
方法1:使用NumPy的sqrt函数
import numpy as np grid['Conf'] = (-b + np.sqrt(b*b - 4.0*a*(c - grid['Distance'])))/(2.0*a)
方法2:使用Pandas Series的sqrt方法
grid['Conf'] = (-b + (b*b - 4.0*a*(c - grid['Distance'])).sqrt())/(2.0*a)
这两种写法都能得到和循环一样的正确结果,同时充分利用Pandas/NumPy的向量化运算优化,速度比循环快几十甚至上百倍。
内容的提问来源于stack exchange,提问作者chadn
相关产品推荐
相关产品推荐

