#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)