Как получить максимальное количество знаков после запятой в каждом столбце pandas кадра данных? - PullRequest
2 голосов
/ 27 апреля 2020

Мне нужно установить глобальную точность с плавающей точкой на минимально возможное значение.

Кроме того, мне нужно получить точность для каждого столбца, частично для получения глобальной точности, а с другой стороны, я хотел бы использовать столько знаков после запятой, сколько пользователь хочет для каждого столбца.

Я получаю данные из 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 данных с плавающей запятой.

Есть ли лучший способ получить количество десятичных разрядов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...