如何在Pandas DataFrame中转换价格 去除整数末尾多余.0/.00后缀
问题原因
你之前的str.replace代码出大量空值,本质是因为price、rrp列是数值类型(float/int),不是字符串类型,直接调用.str访问器时,pandas无法对非字符串元素做字符串处理,会直接返回空值。而直接强转int的问题是会无差别截断所有小数位,比如7.5会被错误转为7,不符合保留非零小数的要求。
解决方案
给两种可直接运行的实现,按你的场景选择即可:
方案1:向量化实现(性能最高,推荐大数据量使用)
用pandas原生向量化逻辑判断,不需要逐行循环,可同时处理两列:
import pandas as pd import numpy as np # 先统一转数值类型,避免列内混有字符串导致运算报错 for col in ['price', 'rrp']: df[col] = pd.to_numeric(df[col], errors='coerce') # 值等于自身取整结果则说明是整数,转int,否则保留原浮点值 df[col] = np.where( df[col] == df[col].astype(int), df[col].astype(int), df[col] )
用你提供的样例数据运行,输出结果完全符合要求:
- price列:
5, 5, 5 - rrp列:
8, 7.5, 9
方案2:逐元素格式化(适合展示/导出场景)
如果不需要严格保留纯数值列类型,只是要去掉无意义的尾缀0用于报表展示、导出,可以用逐元素判断的方式,逻辑更直观:
def clean_price(val): if pd.isna(val): return val float_val = float(val) return int(float_val) if float_val.is_integer() else float_val df[['price', 'rrp']] = df[['price', 'rrp']].applymap(clean_price)
踩坑提醒
- 所有
.str开头的字符串处理方法,只能在字符串类型的列上调用,数值列要做字符串处理必须先通过.astype(str)转成字符串类型,否则必然出现非预期空值。 - 如果你的价格列里混有带货币符号、千分位逗号的字符串,先通过
pd.to_numeric做类型清洗,再执行上述逻辑,避免类型报错。 - 方案1处理后因为同列同时存在整数、浮点数,列类型会自动转为object,不影响常规计算;如果后续要做大规模数值运算,不需要提前做类型转换,在最终导出/展示环节做格式化即可,性能更好。
内容的提问来源于stack exchange,提问作者Lookszz
相关产品推荐
相关产品推荐

