如何仅为DataFrame中一位小数的数值补末尾零(不修改整数)
解决方法
要实现仅对DataFrame列中仅含一位小数的数值补充末尾零,同时保留整数(包括浮点数形式的整数如1.0)和多位小数数值的原样,可以用以下两种方法:
方法一:自定义函数结合apply
编写自定义逻辑区分数值类型,针对性格式化:
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame(data=[[0.3, 0.3], [0.5, 1], [0.400, 0.4], [0.2, 5],[1.2, 1.55]], columns=['credit', 'min_credit']) def format_decimal(num): # 判断是否为整数(兼容浮点数形式的整数,如1.0) if num == int(num): return str(int(num)) # 转换为字符串处理小数部分 num_str = str(num) if '.' in num_str: # 去除末尾无效零后,判断有效小数位数 decimal_part = num_str.split('.')[1].rstrip('0') if len(decimal_part) == 1: return '{:.2f}'.format(num) else: # 去除末尾无效零和多余小数点 return num_str.rstrip('0').rstrip('.') return num_str # 应用到目标列 df['min_credit'] = df['min_credit'].apply(format_decimal)
执行后得到的结果:
| credit | min_credit |
|---|---|
| 0.3 | 0.30 |
| 0.5 | 1 |
| 0.400 | 0.40 |
| 0.2 | 5 |
| 1.2 | 1.55 |
方法二:正则表达式批量替换
通过正则匹配目标格式,批量替换更简洁:
import pandas as pd import re df['min_credit'] = df['min_credit'].astype(str).replace( # 匹配仅一位有效小数的数值,补零为两位 r'^(\d+\.\d)0*$', r'\10', regex=True ).replace( # 匹配浮点数形式的整数,转为纯整数字符串 r'^(\d+)\.0*$', r'\1', regex=True )
补充说明
- 上述方法会将目标列转为字符串类型,若仅需显示层面的格式调整(不修改存储类型),可设置全局显示格式:
此设置会影响所有DataFrame的浮点数显示效果。pd.options.display.float_format = lambda x: '{:.2f}'.format(x) if (x != int(x) and len(str(x).split('.')[1].rstrip('0')) == 1) else str(int(x)) if x == int(x) else str(x)
内容的提问来源于stack exchange,提问作者GeekGroot
相关产品推荐
相关产品推荐

