Проблемы с преобразованием округлых чисел в струнных панд - PullRequest
0 голосов
/ 29 июня 2018

Я округляю столбец с моего информационного кадра до ближайших 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 ]

0 голосов
/ 29 июня 2018

Здесь я думаю, что вы можете использовать форматирование строки. Я использую '${:,.2f}'.format(1234.5) (источник здесь ) для форматирования долларов и центов, но я смог использовать тот же метод форматирования в лямбда-функции для вашего числа с плавающей точкой.

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))
0 голосов
/ 29 июня 2018

Сначала выполните округление, используя вашу функцию

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,))
...