Использование десятичного модуля в серии данных ситуационно - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть датафрейм с большим количеством показаний датчика, которые являются половиной десятичного знака (как в 3.2995, 3.2985 и т. Д.). Я хочу использовать модуль Decimal и свойство округления ROUND_HALF_UP для округления чисел до 3 знаков после запятой, как это делают люди - это связано с тем, что гистограмма выглядит не смешно, как в df.round (3). Мой фактический код длиной 169 строк.

Следующий код создает желаемый вывод - новый фрейм данных, который имеет только те части старого, которые соответствуют ['Characteristic'] == "Height" - но этоне получается так, как я хочу.

df=pd.DataFrame({'Characteristic':{0:"Height",1:"Mass",2:"Height",3:"Height",4:"Height",5:"Mass"},'Meas':{0:3.2215,1:5.1,2:3.2235,3:3.2245,4:3.2255,5:5.9}})
heights=df[df['Characteristic']=="Height"].round(3)
heights

Output1

Выход округляется с 3.2235 и 3.2245 до 3.224, когда я хочу 3.224 и 3.225 соответственно - только дляхарактеристика высоты.

Я получил это далеко:

from decimal import Decimal
import pandas as pd

def round_it(num_to_round):
    return Decimal(num_to_round).quantize(Decimal('0.001'),rounding=ROUND_HALF_UP)

df=pd.DataFrame({'Characteristic':{0:"Height",1:"Mass",2:"Height",3:"Height",4:"Height",5:"Mass"},'Meas':{0:3.2215,1:5.1,2:3.2235,3:3.2245,4:3.2255,5:5.9}})
df=df[df['Characteristic']=="Height"].apply(lambda x: round_it(x['Meas']),axis=1)
df

Output2

Но на выходе есть две проблемы: 1) он не округляетсятак, как я хочу. Он округляет 3.2245 до 3.224 вместо 3.225. Но код, как показано ниже, делает, поэтому я не уверен, как я испортил его в лямбда-функции:

y=Decimal('3.2245').quantize(Decimal('0.001'),rounding=ROUND_HALF_UP)

2) вывод - pandas.core.series.Series вместо pandas.core.frame.DataFrame, как и в методе .round (), то есть код, который я создаю позже для объединения фреймов данных, не будет работать.

Какие-нибудь советы по двум проблемам? Как заставить Decimal.quantize работать с фреймом данных и как получить тот же тип и формат объекта фрейма из первого фрагмента кода с помощью какой-либо версии второго фрагмента кода?

...