Сокращение десятичных чисел фрейма данных Pandas, как с десятичными модулями Python

#python-3.x #pandas #dataframe #decimal

#python-3.x #pandas #фрейм данных #десятичный

Вопрос:

У меня есть несколько фреймов данных, которые выглядят следующим образом.

 data = {'col1': [3.1415926535, 28, -0.0000000000000000618, 1.100000001],
        'col2': ['string1', 'string2', 'string3', 'string4'],
        'col3': [9876543210, 0, 333.3333333, np.nan],
        'col4': [np.nan] * 4}
df = pd.DataFrame(data, index=[1001, 1002, 1003, 1004])

print(df)
              col1      col2          col3  col4
1001  3.141593e 00   string1  9.876543e 09   NaN
1002  2.800000e 01   string2  0.000000e 00   NaN
1003  -6.180000e-17  string3  3.333333e 02   NaN
1004  1.100000e 00   string4           NaN   NaN
  

Все они содержат тысячи строк и сотни столбцов и хранятся в формате CSV.
Из соображений экономии памяти я хочу оптимизировать точность каждого значения, содержащегося в фреймах данных, прежде чем сохранять их в csv.

Для точности в 4 цифры это может дать следующие результаты.

            col1     col2       col3  col4
1001  3.141e 00  string1  9.876e 09   NaN
1002    2.8e 01  string2      0e 00   NaN
1003  -6.18e-17  string3  3.333e 02   NaN
1004    1.1e 00  string4        NaN   NaN
  

Имея иногда большой диапазон в одном столбце, метод «round» не адаптирован к моему случаю, потому что он не позволил бы мне поддерживать одинаковую точность между большими и малыми значениями. Я также протестировал аргумент «float_format» с помощью команды «df.to_csv ()», но он также не соответствует моим потребностям.

Десятичная библиотека Python удовлетворяет этой потребности, но мне не удалось применить ее к фрейму данных. Есть ли у вас решение для эффективного применения такой обработки?

ПРИМЕЧАНИЕ: если ожидаемое значение равно «1.1e 00», я также могу принять формат «1.1», который будет более экономичным после сохранения в CSV. Но этот формат может быть нежелательным для чисел, которые слишком экстремальны или слишком близки к нулю… Поэтому научная нотация кажется мне более подходящей.

Ответ №1:

Запустите эту команду перед отображением DF:

 pd.options.display.float_format = "{:,.4E}".format
  

В качестве альтернативы, если вам нужно всего несколько строк, например:

 df['col1'] = df['col1'].map('${:,.4E}'.format)
  

Комментарии:

1. это не может работать, это та же проблема, что и с методом round. Например, число «-0.0000000000000000618» преобразуется в «-0.0000″… Поэтому я теряю информацию о цифре «618»

2. Отлично, применение карты только к числовым столбцам работает хорошо. Спасибо!

3. для col в списке(df.select_dtypes(include=[np.number])): df[col] = df[col].map(‘{:,.4E}’.format)