python中(DataFrame数据框)通过给一个变量的值打标签生成另一个变量,用循环结合iloc赋值太慢怎么办?
学生:
老师 我问你个问题
for i in range(0,len(rfm_.iloc[:,0])): if rfm_.iloc[i,0] > F_mean: rfm_.iloc[i,0] = 1 else: rfm_.iloc[i, 0] = 0 if rfm_.iloc[i,1] < R_mean: rfm_.iloc[i, 1] = 1 else: rfm_.iloc[i, 1] = 0 if rfm_.iloc[i,2] > M_mean: rfm_.iloc[i, 2] = 1 else: rfm_.iloc[i, 2] = 0
如果就这样打标签的话 我这个用户量来计算的话 代码要跑很久吗。。。
也就126W
怎么跑不出来了
老师:是的,会跑很久,因为这个命令效率比较低
学生:
不是 我现在是打标签
就是用用户的指标均值作为阈值
所以就是很慢的是吧
就是我用for循环的话就是很慢 那有什么比较快的方法吗
好纠结
老师:你是要根据一个变量生成一个标签变量吗
学生:是的
老师:我想想啊
学生:我饭都吃完了 还没跑出来。。我感觉哪里有问题哇
老师:你的那个变量是什么样子的,取值什么样,给我截个图
学生:
然后跟指标的均值做比较 去打标签
我还没敢家维度
这都跑不出来了
不知道是代码有问题还是什么原因 都好久了
老师:
你把rfm那个数据框的表头和前几条记录给我贴一下
这样方便我给你写命令
学生:
F R M
用户ID
_637276942176622229 11 45.0 166.17
_637276942176769136 11 50.0 66.73
_637276942177839833 37 18.0 143.02
_637276942181248783 24 29.0 167.35
_637276942181646749 4 27.0 39.75
老师:然后把打标签的规则告诉我,也就是生成三个标签变量对吧
学生:
# 标注每个用户的RFM值 == 这里用各指标的均值作为阈值
R_mean = rfm_["R"].mean()
F_mean = rfm_["F"].mean()
M_mean = rfm_["M"].mean()
print(R_mean,F_mean,M_mean)
老师:然后打标签为0或者1对不
学生:
对
这个循环不敢跑了 感觉会耽误好多时间 不知道什么鬼
老师:
循环不能大规模用
R_mean = rfm_["R"].mean()
F_mean = rfm_["F"].mean()
M_mean = rfm_["M"].mean()
rfm_["RLabel"]=rfm_["R"].map(lambda x:1 if x<R_mean else 0)
rfm_["FLabel"]=rfm_["F"].map(lambda x:1 if x>F_mean else 0)
rfm_["MLabel"]=rfm_["M"].map(lambda x:1 if x>M_mean else 0)
执行这个代码试试,这个速度比较快
那个循环要一个一个循环,很慢
这个map是同时执行所有的记录,会很快的
学生:
卧槽。。
这个这么快
一秒。。。
真NB卧槽
用hex函数,可以把10进制整数变成十六进制数比如上面的例子十进制数15,变成16进制数是f,里面的0x只是一个前缀十进制数255,变成16进制数是ff,