You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:51:30