将四舍五入的浮点数转换为字符串时出现问题 Pandas

8

我正在将数据框中的列四舍五入为最接近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  
2个回答

2

在这里,我认为您可以使用字符串格式化。我使用'${:,.2f}'.format(1234.5)(源自此处)来格式化美元和美分,但我能够在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即可。 - Jose Vasquez
1
@JoseVasquez,你最初的问题说你要四舍五入到最近的5个浮点数,我认为这是第5位小数。如果这个答案不是你要求的,请告诉我,我会相应地更新它。 - BenG

0

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

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. - Jose Vasquez
然后在格式化字符串之前应用四舍五入。我会更新我的答案来涵盖这一点。 - kosnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接