Формат / Подавить научную запись из результатов агрегации 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()
Другие вопросы по тегам