Формат / Подавить научную запись из результатов агрегации Python Pandas
Как можно изменить формат для вывода из групповой операции в пандах, которая производит научную запись для очень больших чисел. Я знаю, как сделать форматирование строк в Python, но я не могу понять, как применить его здесь.
df1.groupby('dept')['data1'].sum()
dept
value1 1.192433e+08
value2 1.293066e+08
value3 1.077142e+08
Это подавляет научную нотацию, если я преобразую в строку, но теперь мне просто интересно, как форматировать строки и добавлять десятичные дроби.
sum_sales_dept.astype(str)
8 ответов
Конечно, ответ, который я привел в комментариях, не очень полезен. Вы можете указать свой собственный конвертер строк, например, так.
In [25]: pd.set_option('display.float_format', lambda x: '%.3f' % x)
In [28]: Series(np.random.randn(3))*1000000000
Out[28]:
0 -757322420.605
1 -1436160588.997
2 -1235116117.064
dtype: float64
Я не уверен, что это предпочтительный способ сделать это, но это работает.
Преобразование чисел в строки исключительно для эстетических целей кажется плохой идеей, но если у вас есть веская причина, это один из способов:
In [6]: Series(np.random.randn(3)).apply(lambda x: '%.3f' % x)
Out[6]:
0 0.026
1 -0.482
2 -0.694
dtype: object
Вот еще один способ сделать это, похожий на ответ Дэна Аллана, но без лямбда-функции:
>>> pd.options.display.float_format = '{:.2f}'.format
>>> Series(np.random.randn(3))
0 0.41
1 0.99
2 0.10
или же
>>> pd.set_option('display.float_format', '{:.2f}'.format)
Вы можете использовать функцию округления только для подавления научной нотации для конкретного кадра данных:
df1.round(4)
или вы можете подавить это глобально:
pd.options.display.float_format = '{:.4f}'.format
Если вы хотите стилизовать вывод фрейма данных в ячейке записной книжки jupyter, вы можете установить стиль отображения для каждого фрейма данных:
df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")
https:https://stackru.com/images/284332bef766af7fd9e504ec63cdc4126f229cd3.png
См. Документацию здесь.
Установка фиксированного количества десятичных знаков в глобальном масштабе часто является плохой идеей, поскольку маловероятно, что это будет подходящее количество десятичных знаков для всех ваших различных данных, которые вы будете отображать независимо от величины. Вместо этого попробуйте это, которое даст вам научную нотацию только для больших и очень малых значений (и добавит разделитель тысяч, если вы не опустите ","):
pd.set_option('display.float_format', lambda x: '%,g' % x)
Или, чтобы почти полностью подавить научную нотацию без потери точности, попробуйте следующее:
pd.set_option('display.float_format', str)
У меня было несколько фреймов данных с разными числами с плавающей запятой, поэтому, спасибо Аллану, придумал динамическую длину.
pd.set_option('display.float_format', lambda x: f'%.{len(str(x%1))-2}f' % x)
Минус этого в том, что если у вас последний 0 в float, он его сократит. Значит будет не 0,000070, а 0,00007.
В дополнение к этому полезному комментарию, вот решение, устанавливающее параметры форматирования только для отображения результатов без постоянного изменения параметров:
with pd.option_context('display.float_format', lambda x: f'{x:,.3f}'):
display(sum_sales_dept)
dept
value1 119,243,300.0
value2 129,306,600.0
value3 107,714,200.0
Если вы хотите использовать значения, скажем, как часть csvfile csv.writer, числа могут быть отформатированы перед созданием списка:
df['label'].apply(lambda x: '%.17f' % x).values.tolist()