如何将DataFrame价格列中带M/k的单位值转换为数值并正确回填?
问题原因
你第二种写法的错误核心是:循环过程中每次都给整个car['Price']列赋值为当前的x,相当于每轮循环都把所有行的价格覆盖成当前值,最终整个列自然会保留最后一轮循环的计算结果。
解决方案
方案1:基于现有代码的最小修改
你第一段代码已经把所有计算好的正确值存到了correctVal列表里,直接把这个列表赋值给Price列即可:
car['Price'] = car['Price'].astype('string') car['Price'] = car['Price'].str.replace('M', '*1000000', regex=True) car['Price'] = car['Price'].str.replace('k', '*1000', regex=True) correctVal = [] for x in car['Price']: x = pd.eval(x) correctVal.append(x) # 新增这一行直接赋值 car['Price'] = correctVal
方案2:更简洁的向量化写法(无需手动循环)
直接用apply方法批量处理每一行的值,代码更简洁,执行效率也更高:
car['Price'] = car['Price'].astype('string') car['Price'] = car['Price'].str.replace('M', '*1000000', regex=True) car['Price'] = car['Price'].str.replace('k', '*1000', regex=True) # 直接批量执行表达式计算 car['Price'] = car['Price'].apply(pd.eval)
两种方案都可以正常完成数值转换和回填,第二种写法更符合pandas的使用习惯,也不容易出现循环赋值的错误。
内容的提问来源于stack exchange,提问作者bummydummy
相关产品推荐
相关产品推荐

