如何基于列变量的计算结果替换DataFrame中price列的所有值?为何df.replace方法未生效?
嘿,我来帮你捋捋为啥你的代码没生效,以及怎么搞定它~
问题原因分析
- 循环变量被覆盖:在
iterrows()的循环里,number和updateNum会被每一行的新值不断覆盖,最后执行df.replace()时,只会用最后一次循环得到的那一组数值去替换,自然没法批量更新所有行的price。 replace方法用错场景:这个方法是用来匹配全表中等于to_replace的固定值并替换,而你需要的是对每一行的price做个性化计算后更新,完全不是一个逻辑。- 没把计算结果写回原表:你在循环里只是算出了
updateNum,但压根没把这个值存回DataFrame的对应行,最后用replace相当于做了一次无效的全局替换操作。
解决方法
首选方案:用Pandas矢量化运算(高效又简洁)
Pandas的核心就是矢量化操作,直接对整列做计算,一行代码就能搞定所有行,完全不需要循环:
maindf['price'] = maindf['price'] / 10 ** 2
这行代码会自动遍历price列的每一个元素,执行除以100的运算,然后直接更新原列的值,既高效又不会出错,这才是Pandas的正确打开方式~
特殊场景下用循环(不推荐,效率低)
如果你确实因为某些特殊需求必须用逐行循环,那要在循环内部直接把计算结果赋值回DataFrame的对应位置,而不是最后用replace:
for index, row in maindf.iterrows(): number = row["price"] updateNum = number / 10 ** 2 # 通过loc索引直接把值写回对应行的price列 maindf.loc[index, 'price'] = updateNum
不过要注意,iterrows()的效率比矢量化操作低很多,数据量大的时候会明显变慢,所以能不用就不用哈。
内容的提问来源于stack exchange,提问作者Spaceglider
相关产品推荐
相关产品推荐

