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
相关产品推荐
相关产品推荐

