Форматування / придушення наукових позначень за результатами агрегації 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)


3
Я бачив це питання, але не знаю, як це мені допомагає. Я просто прагну зберегти поточний тип, який є плаваючим, і просто показати всі десяткові знаки в результаті замість наукових позначень.
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', лямбда x: '% .3f'% x) теж працював для мене
drive_spider

5
Це працює, і ви також можете використовувати новіші позначення f-string. Як, 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)

1
Я думаю, що використання рядка формату було б більш доступним для членів команди, які менш знайомі з Python і можуть не розуміти функцій лямбда.
Стівен К. Хоуелл

23

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

df1.round(4)

або ви можете придушити глобально:

pd.options.display.float_format = '{:.4f}'.format

11

Якщо ви хочете стилізувати висновок кадру даних у комірці ноутбука юпітера, ви можете встановити стиль відображення на основі кадру даних:

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.