Python:小数为.0时取整,其余情况保留1位小数的实现
浮点数格式化需求与代码问题
需求:对浮点数进行格式化,当小数部分为.0时显示为整数,其他情况保留1位小数。
现有问题:使用round函数处理时,data1计算结果为50.0,期望显示为50;data2计算结果应为37.5,但当前代码输出不符合预期。
现有代码
import pandas as pd data1 = pd.DataFrame({'id' : ['a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a2', 'a2'], 'label' : ['0','0','1','0','1','0','1','1']}) print(round((data1.id.eq('a1').sum() / (data1.id.eq('a1').sum() + data1.id.eq('a2').sum()).round(2) * 100), 0)) data2 = pd.DataFrame({'id' : ['a1', 'a1', 'a1', 'a2', 'a2', 'a2', 'a2', 'a2'], 'label' : ['0','0','1','0','1','0','1','1']}) print(round((data2.id.eq('a1').sum() / (data2.id.eq('a1').sum() + data2.id.eq('a2').sum()).round(2) * 100), 0))
问题分析
- 代码逻辑错误:
round(2)的位置不合理,它被作用在分母的求和结果上,而非整个计算式,虽然这里分母是整数不影响结果,但后续用round(...,0)直接把37.5截断成了整数38,完全不符合保留一位小数的需求。 round函数本身做不到“小数部分为.0时显示整数,否则保留一位小数”的格式化效果,它返回的始终是浮点数,比如50.0无法自动转为整数格式。
解决方案
步骤1:修正计算逻辑,保留准确数值
先算出精确的百分比值,不要过早用round截断:
# 计算data1的百分比 count_a1 = data1.id.eq('a1').sum() count_total = count_a1 + data1.id.eq('a2').sum() percent1 = (count_a1 / count_total) * 100 # 计算data2的百分比 count_a1_2 = data2.id.eq('a1').sum() count_total_2 = count_a1_2 + data2.id.eq('a2').sum() percent2 = (count_a1_2 / count_total_2) * 100
步骤2:自定义格式化函数
写一个函数处理浮点数的显示规则:
def format_float(num): if num.is_integer(): return int(num) else: return round(num, 1)
步骤3:应用格式化并输出
print(format_float(percent1)) # 输出50 print(format_float(percent2)) # 输出37.5
完整代码
import pandas as pd def format_float(num): if num.is_integer(): return int(num) else: return round(num, 1) # 处理data1 data1 = pd.DataFrame({'id' : ['a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a2', 'a2'], 'label' : ['0','0','1','0','1','0','1','1']}) count_a1 = data1.id.eq('a1').sum() count_total = count_a1 + data1.id.eq('a2').sum() percent1 = (count_a1 / count_total) * 100 print(format_float(percent1)) # 处理data2 data2 = pd.DataFrame({'id' : ['a1', 'a1', 'a1', 'a2', 'a2', 'a2', 'a2', 'a2'], 'label' : ['0','0','1','0','1','0','1','1']}) count_a1_2 = data2.id.eq('a1').sum() count_total_2 = count_a1_2 + data2.id.eq('a2').sum() percent2 = (count_a1_2 / count_total_2) * 100 print(format_float(percent2))
内容的提问来源于stack exchange,提问作者tonydanza123
相关产品推荐
相关产品推荐

