Format / Menekan Notasi Ilmiah dari Hasil Agregasi Python Pandas

162

Bagaimana kita bisa memodifikasi format untuk output dari operasi grup dengan panda yang menghasilkan notasi ilmiah untuk jumlah yang sangat besar?

Saya tahu bagaimana melakukan pemformatan string dalam python tapi saya bingung ketika harus menerapkannya di sini.

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

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

Ini menekan notasi ilmiah jika saya mengonversi ke string tetapi sekarang saya hanya ingin tahu bagaimana memformat string dan menambahkan desimal.

sum_sales_dept.astype(str)
horatio1701d
sumber
2
mungkin duplikat Menekan notasi ilmiah dalam panda?
Dan Allan
3
Saya melihat pertanyaan itu tetapi saya tidak yakin bagaimana itu membantu saya. Saya hanya ingin melestarikan dtype saat ini yang mengambang dan hanya menunjukkan semua desimal dalam hasil alih-alih notasi ilmiah.
horatio1701d
Itu mungkin hanya hal tampilan. Tetapi jika Anda berpikir ada sesuatu yang khusus tentang masalah Anda yang membuat masalah Anda berbeda dari yang ada di tautan Dan, maka Anda perlu memposting lebih banyak informasi tentang masalah Anda, terutama dengan dataset kecil yang mereproduksi masalah tersebut. Juga apa dtypeshasil Anda?
TomAugspurger

Jawaban:

237

Memang, jawaban yang saya tautkan di komentar tidak terlalu membantu. Anda dapat menentukan konverter string Anda sendiri seperti itu.

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

Saya tidak yakin apakah itu cara yang disukai untuk melakukan ini, tetapi itu berhasil.

Mengubah angka menjadi string murni untuk tujuan estetika sepertinya ide yang buruk, tetapi jika Anda memiliki alasan yang bagus, ini adalah salah satu caranya:

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
Dan Allan
sumber
1
Terima kasih Dan. Apakah Anda tahu cara mengatur ulang opsi panda?
Josh
1
@Josh Untuk mengatur opsi sementara di panda, Anda dapat menggunakan pandas.option_context(lihat pandas.pydata.org/pandas-docs/stable/generated/… ).
muellermarkus
Seringkali bukan untuk tujuan estetika, tetapi untuk membaca informasi lebih cepat melalui korteks visual melalui kerangka data numerik yang besar.
matanster
pd.set_option ('display.float_format', lambda x: '% .3f'% x) bekerja untuk saya juga
driven_spider
5
Ini berfungsi dan Anda juga dapat menggunakan notasi f-string yang lebih baru. Seperti pd.set_option('display.float_format', lambda x: f'{x:,.3f}')jika Anda menginginkan seribu pemisah juga.
576i
87

Inilah cara lain untuk melakukannya, mirip dengan jawaban Dan Allan tetapi tanpa fungsi lambda:

>>> pd.options.display.float_format = '{:.2f}'.format
>>> Series(np.random.randn(3))
0    0.41
1    0.99
2    0.10

atau

>>> pd.set_option('display.float_format', '{:.2f}'.format)
tfhans
sumber
1
Saya pikir menggunakan string format akan lebih mudah didekati oleh anggota tim yang kurang terbiasa dengan Python, dan mungkin tidak mengerti fungsi lambda.
Steven C. Howell
23

Anda dapat menggunakan fungsi bundar hanya untuk menekan notasi ilmiah untuk kerangka data tertentu:

df1.round(4)

atau Anda dapat menekan secara global dengan:

pd.options.display.float_format = '{:.4f}'.format
Vlad Bezden
sumber
11

Jika Anda ingin mendesain output dari frame data dalam sel notebook jupyter, Anda dapat mengatur gaya tampilan berdasarkan per-dataframe:

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

masukkan deskripsi gambar di sini

Lihat dokumentasi di sini .

penghijauan
sumber
0

Jika Anda ingin menggunakan nilai, katakan sebagai bagian dari csvfile csv.writer, angka-angka dapat diformat sebelum membuat daftar:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
evil242
sumber