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

Pandas:移除列中浮点数内的字符串并保留小数精度

解决Code列保留小数精度转换为Float的问题

你的问题核心在于之前的正则表达式只匹配了整数部分,导致小数部分被直接丢弃了。我们可以通过调整正则规则捕获完整的数字(包含小数),再设置合适的显示格式来实现你想要的结果。

步骤1:修正正则表达式,提取完整数字

原来的(\d+)只能匹配连续的整数序列,遇到小数点或字母就会停止匹配——比如6.05只会提取出6,010.0只会提取出010(转成float后是10.0)。我们需要改用能兼容整数和小数的正则:

import pandas as pd

# 构造你的原始DataFrame
data = {
    'plan': ['A', 'A', 'A', 'A', 'A'],
    'type': ['cont', 'cont', 'cont', 'cont', 'vend'],
    'hour': [0, 2, 0, 0, 1],
    'status': ['ok', 'ok', 'notok', 'other', 'ok'],
    'code': ['010.0', '025GWA', '010VVT', '6.05', '6.01']
}
df = pd.DataFrame(data)

# 提取包含小数的完整数字,转换为float类型
df['code'] = df['code'].str.extract('(\d*\.?\d+)').astype(float)

这里的正则(\d*\.?\d+)逻辑是:

  • \d*:匹配0个或多个数字(兼容像.05这种特殊开头的情况,你的数据里没有但能提升通用性)
  • \.?:匹配0个或1个小数点
  • \d+:匹配至少1个数字(确保捕获到有效数值)

步骤2:设置显示格式为两位小数

此时code列已经是精度完整的float类型(比如6.05、6.01都保留了原始小数),但pandas默认显示不会强制两位小数(比如10.0会显示成10.0)。我们可以设置全局显示选项来统一格式:

# 设置全局浮点数显示为两位小数
pd.options.display.float_format = '{:.2f}'.format

现在查看DataFrame:

print(df)

输出就会完全符合你的预期:

plan  type  hour status  code
0    A  cont     0     ok 10.00
1    A  cont     2     ok 25.00
2    A  cont     0  notok 10.00
3    A  cont     0  other  6.05
4    A  vend     1     ok  6.01

补充说明

如果你不想全局修改显示格式,也可以单独对code列做格式化(注意这会把列转为字符串类型):

df['code'] = df['code'].apply(lambda x: '{:.2f}'.format(x))

但更推荐保持float类型+调整显示格式的方案,这样后续还能对code列进行数值计算。

内容的提问来源于stack exchange,提问作者Thabra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:38:24