数据预处理 - 提速优化 lambda...if...else(if...else...) +map() 比iterrows()遍历求值快 6 万倍 - Python代码
时间:2019-02-14
本文章向大家介绍数据预处理 - 提速优化 lambda...if...else(if...else...) +map() 比iterrows()遍历求值快 6 万倍 - Python代码,主要包括数据预处理 - 提速优化 lambda...if...else(if...else...) +map() 比iterrows()遍历求值快 6 万倍 - Python代码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Python 进行 DataFrame 数据处理的过程中,需要判断某一列中的值(条件),然后对其他两列或三列进行求和(均值/最值)等运算,并把运算结果存储在新的一列中。干说可能觉得比较晕,我们来看一个例子:
下表 data_base 中,预测区间这一列共有 1/2/3/4 类值,现需要生成新列预测概率,新列的计算规则为:
- 若预测区间=1,则求分类概率_1与分类概率_2的均值;
- 若预测区间=2/3,则求分类概率_1与分类概率_2与分类概率_3的均值;
- 若预测区间=4,则为分类概率_1的值;
需求应该说清楚了,下面我们来看看根据上述计算规则,传统的代码怎么写。
传统代码思路:
iterrows() 遍历 data_base 表,使用 for ... if ... elif ...计算预测概率的值,
import time
start_1 =time.clock()#记录代码开始运行时间
data_base[u'预测概率_1'] = 0#赋初始值
for index,row in data_base.iterrows():
if (row['预测区间'] == 1):
data_base.loc[index, '预测概率_1'] = ((data_base.loc[index, '分类概率_1'] + data_base.loc[index, '分类概率_2'])/2).astype(float)
elif (row['预测区间'] == 2) | (row['预测区间'] == 3):
data_base.loc[index, '预测概率_1'] = ((data_base.loc[index, '分类概率_1'] + data_base.loc[index, '分类概率_2']+data_base.loc[index, '分类概率_3'])/3).astype(float)
elif (row['预测区间'] == 4):
data_base.loc[index, '预测概率_1'] = ((data_base.loc[index, '分类概率_1'])).astype(float)
end_1 = time.clock()#记录代码结束运行时间
print('Running time: %s Seconds'%(end_1-start_1))#输出耗时
输出:Running time: 539.8234579883166 Seconds
一万四千行数据,运行了将近十分钟...........
下面来看看比他快 6 万倍的代码(思路:lambda...if...else(if...else...) 定义计算规则,然后使用 map() 函数做映射):
start_2 =time.clock()
a = data_base[u'预测区间'].tolist()
x = data_base[u'分类概率_1'].tolist()
y = data_base[u'分类概率_2'].tolist()
z = data_base[u'分类概率_3'].tolist()
b = list(map(lambda a, x, y, z: (x+y+z)/3 if (a==2)|(a==3) else ((x+y)/2 if a==1 else(x if a==4 else 0)),a, x, y, z))
b = pd.DataFrame(b, columns=['预测概率_2'])#转化成dataframe格式
data_base = pd.concat([data_base, b['预测概率_2']], axis = 1, join='outer', sort=False)
end_2 = time.clock()
print('Running time: %s Seconds'%(end_2-start_2))
输出:Running time: 0.009003164524415297 Seconds
539.823 / 0.009 ~~ 60000
这可不就是快了 6 万倍嘛!哈哈......
- 位运算的方法,大结
- 位运算的方法,小结
- Golang语言--多线程求和
- AlphaGo Zero代码迟迟不开源,TF等不及自己推了一个
- nyoj---快速查找素数
- 转--Golang图像处理工具库,图像相似度计算,图像二值化
- HDUOJ----湫湫系列故事——减肥记I
- HDUOJ----Eddy's research I
- 【亚马逊加盟对抗谷歌联盟ONNX】微软Facebook深度学习开源联盟再添盟友
- HDUOJ--8球胜负
- HDUOJ--点球大战
- Golang语言社区--使用百度API获取经纬度
- HDUOJ---The number of divisors(约数) about Humble Numbers
- HDUOJ----最少拦截系统
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 千万级数据表选错索引导致的线上慢查询事故
- 递归优化
- Webshell 高级样本收集
- 处理Sprint Boot与Storm1.2.2日志实现的冲突,使用logback记录日志
- Docker 命令总结
- python主题LDA建模和t-SNE可视化
- cannot import name ‘imresize‘ from ‘scipy.misc‘
- 一分钟基础:计算机为什么使用二进制?
- 使用hibernate validate做参数校验
- Leetcode No.4 寻找两个正序数组的中位数
- R语言 RevoScaleR的大规模数据集决策树模型应用案例
- 快速学习-sentinel控制台
- 快速学习-sentinel注解支持
- Java工具集-验证码工具类
- RocketMQ 零基础 集群及控制台部署