Формат / Подавить научную запись из результатов агрегации Python Pandas

162

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

Я знаю, как выполнять форматирование строк в Python, но я не могу понять, как применить его здесь.

df1.groupby('dept')['data1'].sum()

dept
value1       1.192433e+08
value2       1.293066e+08
value3       1.077142e+08

Это подавляет научную нотацию, если я преобразую в строку, но теперь мне просто интересно, как отформатировать строку и добавить десятичные дроби.

sum_sales_dept.astype(str)
horatio1701d
источник
2
возможный дубликат подавления научного обозначения в пандах?
Дан Аллан
3
Я видел этот вопрос, но я не уверен, как это мне помогает. Я просто хочу сохранить текущий тип d, который является float, и просто показать все десятичные числа в результате вместо научной записи.
horatio1701d
Это, вероятно, просто вещь дисплея. Но если вы думаете, что что-то конкретное в вашей проблеме отличает вашу от ссылки Дэна, вам нужно опубликовать больше информации о вашей проблеме, желательно с небольшим набором данных, который воспроизводит проблему. И каковы dtypesваши результаты?
TomAugspurger

Ответы:

237

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

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
Дэн Аллан
источник
1
Спасибо Дэн. Вы знаете, как сбросить настройки панд?
Джош
1
@Josh Для временной настройки параметров в пандах вы можете использовать pandas.option_context(см. Pandas.pydata.org/pandas-docs/stable/generated/… ).
muellermarkus
Часто это делается не для эстетических целей, а для более быстрого просмотра информации через визуальную кору на больших числовых фреймах данных.
matanster
pd.set_option ('display.float_format', lambda x: '% .3f'% x) работал и для меня
ведомый_спайдер
5
Это работает, и вы также можете использовать более новую нотацию f-строки. Например, pd.set_option('display.float_format', lambda x: f'{x:,.3f}')если вы хотите разделитель тысяч.
576i
87

Вот еще один способ сделать это, похожий на ответ Дэна Аллана, но без лямбда-функции:

>>> 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)
tfhans
источник
1
Я думаю, что использование строки формата было бы более доступным для членов команды, которые менее знакомы с Python и могут не понимать лямбда-функции.
Стивен Хоуэлл,
23

Вы можете использовать функцию округления только для подавления научной нотации для конкретного кадра данных:

df1.round(4)

или вы можете подавить это глобально:

pd.options.display.float_format = '{:.4f}'.format
Влад Безден
источник
11

Если вы хотите стилизовать вывод фрейма данных в ячейке ноутбука Jupyter, вы можете установить стиль отображения для каждого фрейма данных:

df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")

введите описание изображения здесь

Смотрите документацию здесь .

Флорестан
источник
0

Если вы хотите использовать значения, скажем, как часть csvfile csv.writer, числа могут быть отформатированы перед созданием списка:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
evil242
источник