【问题标题】:Issues converting rounded float to string pandas将舍入浮点数转换为字符串 pandas 的问题
【发布时间】:2018-12-08 18:56:29
【问题描述】:

我将数据框中的一列四舍五入到最接近的 5 个浮点数。之后,我将列值转换为字符串,但是当我这样做时,浮点数会像未舍入一样返回。我正在使用 Python 2.7

import pandas as pd
df=pd.read_excel(C:"path")

def custom_round(x, base=5):
    return base * round(float(x)/base)

df['A'] = df['kl'].apply(lambda x: custom_round(x, base=.05))
df['b'] = "D = "  + df['A'].astype(str)


     kl     A                       b  
 0.600001  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.600000  0.60  D = 0.6000000000000001  
 0.600000  0.60  D = 0.6000000000000001  
 0.600587  0.60  D = 0.6000000000000001  
 0.601573  0.60  D = 0.6000000000000001  
 0.601168  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.600000  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.600001  0.60  D = 0.6000000000000001  
 0.850001  0.85  D = 0.8500000000000001  

【问题讨论】:

    标签: python-2.7 pandas dataframe floating-point rounding


    【解决方案1】:

    首先使用您的函数进行舍入

    df['A'] = df['kl'].apply(lambda x: custom_round(x, base=.05))
    

    现在,您可以使用python 的字符串格式来舍入您的浮点数

    df['b'] =  df['A'].apply(lambda x:  'D = ' + '{:.5f}'.format(x))
    

    我不确定这对python 2.7是否有效,如果不是你可以试试

    df['b'] = df['A'].apply(lambda x:  'D = ' + '%.5f' % (x,))
    

    【讨论】:

    • 当我说最接近的第 5 位不是小数点后第 5 位时,这不起作用。例如0.4323 = 0.45, 0.49 = 0.50, 0.7124 = 0.70.
    • 然后在格式化字符串之前应用舍入。我将更新我的答案以涵盖这一点
    【解决方案2】:

    这里我认为你可以使用字符串格式。我使用'${:,.2f}'.format(1234.5)(来源here)来格式化美元和美分,但我能够在lambda 函数中使用相同的格式化方法将浮点数转换为字符串。

    import pandas as pd 
    data = {'kl' : [0.600001, 0.600001, 0.600000, 0.600000, 
                    0.600587, 0.601573, 0.601168, 0.600001, 
                    0.600001, 0.600001, 0.600000, 0.600001, 
                    0.600001, 0.600001, 0.600001, 0.850001]}
    df = pd.DataFrame.from_dict(data)
    
    def custom_round(x, base=5):
        return base * round(float(x)/base)
    
    df['A'] = df['kl'].apply(lambda x: custom_round(x, base=.05))
    df['b'] = "D = " + df['A'].apply(lambda s: '{:,.5f}'.format(s))
    

    【讨论】:

    • 这个答案很好,只需将 {:,.2f}'.format(s) 中的号码更改为 2
    • @JoseVasquez 您最初的问题是四舍五入到最接近的 5 个浮点数,我认为这是小数点后第 5 位。如果此答案不是您要求的,请告诉我,我会相应更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2017-11-29
    • 2020-10-12
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多