Мне нужно установить глобальную точность с плавающей точкой на минимально возможное значение.
Кроме того, мне нужно получить точность для каждого столбца, частично для получения глобальной точности, а с другой стороны, я хотел бы использовать столько знаков после запятой, сколько пользователь хочет для каждого столбца.
Я получаю данные из CSV. В начале я загружаю все ячейки в виде строк. После преобразования в числа столбцы могут иметь разные типы dtypes.
В целочисленных столбцах (без '.') Нет значений NaN. Поэтому я подумал, что могу сделать копию информационного кадра, когда он содержит строки, и разделить число на «.» персонаж. Потому что, если в ячейках уже есть числа с плавающей точкой, я не смог бы получить количество десятичных разрядов, потому что я мог бы получить что-то вроде this : 5.55 % 1 >> 0.550000000001
. Я имею в виду, что иногда python печатает только десятичное приближение к истинному десятичному значению двоичного приближения, сохраненного машиной. Тогда я понимаю, что невозможно точно получить десятичные значения.
Нет столбцов со всеми значениями NaN
import pandas as pd
pd.set_option('precision', 15) # if > 15 the precision is not working well
df = pd.DataFrame({
'x':['5.111112222233', '5.111112222', '5.11111222223', '5.2227', '234', '4', '5.0'],
'y':['ÑKDFGÑKL', 'VBNVBN', 'GHJGHJ', 'GFGDF', 'SDFS', 'SDFASD', 'LKJ'],
'z':['5.0', '5.0', '5.0', '5.0', '3', '6', '5.0'],
'a':['5', '5', '5', '5', '3', '6', '9'],
'b':['5.0', '5.0', '5.0', '5.0', '3.8789', '6', np.nan],
})
df_str = df.copy(deep=True)
df = df.apply(lambda t: pd.to_numeric(t, errors='ignore', downcast='integer'))
precisions = {}
pd_precision = 0
# Float columns
for c in df.select_dtypes(include=['float64']):
p = int(df_str[c].str.rsplit(pat='.', n=1, expand=True)[1].str.len().max()) # always has one '.'
if p > pd_precision:
pd_precision = p
precisions[c] = p
# Integer columns
for c in df.select_dtypes(include=['int8', 'int16', 'int32', 'int64']):
precisions[c] = 0
# String and mixed columns
for c in df.select_dtypes(include=['object']): # or exclude=['int8', 'int16', 'int32', 'int64', 'float64']
precisions[c] = False
if pd_precision > 15:
pd_precision = 15
pd.set_option('precision', pd_precision) # pd_precision = 12
precisions # => {'x': 12, 'b': 4, 'z': 0, 'a': 0, 'y': False}
Я знаю, что существует Десятичное число класс, но я считаю, что я потеряю все преимущества производительности pandas данных с плавающей запятой.
Есть ли лучший способ получить количество десятичных разрядов?