Bagaimana cara menampilkan panda DataFrame dari pelampung menggunakan string format untuk kolom?

166

Saya ingin menampilkan kerangka data panda dengan format yang diberikan menggunakan print()dan IPython display(). Sebagai contoh:

df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])
print df

         cost
foo   123.4567
bar   234.5678
baz   345.6789
quux  456.7890

Saya ingin entah bagaimana memaksa ini ke dalam pencetakan

         cost
foo   $123.46
bar   $234.57
baz   $345.68
quux  $456.79

tanpa harus memodifikasi data itu sendiri atau membuat salinan, cukup ubah cara itu ditampilkan.

Bagaimana saya bisa melakukan ini?

Jason S
sumber
2
Apakah costsatu-satunya kolom float, atau adakah kolom float lain yang tidak boleh diformat $?
Unutbu
Saya ingin melakukannya hanya untuk kolom biaya (data asli saya memiliki kolom lain)
Jason S
Saya menyadari bahwa setelah $ terpasang, tipe data secara otomatis berubah ke objek.
Nguai al

Jawaban:

284
import pandas as pd
pd.options.display.float_format = '${:,.2f}'.format
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])
print(df)

hasil panen

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79

tetapi ini hanya berfungsi jika Anda ingin setiap pelampung diformat dengan tanda dolar.

Jika tidak, jika Anda ingin pemformatan dolar hanya untuk beberapa float, maka saya pikir Anda harus memodifikasi pra-dataframe (mengonversi float tersebut menjadi string):

import pandas as pd
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])
df['foo'] = df['cost']
df['cost'] = df['cost'].map('${:,.2f}'.format)
print(df)

hasil panen

         cost       foo
foo   $123.46  123.4567
bar   $234.57  234.5678
baz   $345.68  345.6789
quux  $456.79  456.7890
unutbu
sumber
3
Solusi ini masih berfungsi dengan baik untuk saya pada panda 0.22.
Taylor Edmiston
19
seperti yang ditunjukkan misalnya di sini , Anda dapat memodifikasi opsi hanya untuk blok yang diberikan dengan menggunakanwith pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner
1
Ekstra 'sebelum tanda kurung penutup pada komentar @AndreHolzner; jika tidak, itu berfungsi seperti pesona!
dTanMan
67

Jika Anda tidak ingin mengubah kerangka data, Anda bisa menggunakan formatter khusus untuk kolom itu.

import pandas as pd
pd.options.display.float_format = '${:,.2f}'.format
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])


print df.to_string(formatters={'cost':'${:,.2f}'.format})

hasil panen

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
Chris Moore
sumber
2
Apakah mungkin untuk membuat formatter bekerja pada kolom bertingkat?
user2579685
3
AFAICT, contoh ini bekerja tanpa baris keduapd.options.display.float_format = '${:,.2f}'.format
pianoJames
56

Pada Pandas 0.17 sekarang ada sistem gaya yang pada dasarnya memberikan pandangan diformat dari DataFrame menggunakan string format Python :

import pandas as pd
import numpy as np

constants = pd.DataFrame([('pi',np.pi),('e',np.e)],
                   columns=['name','value'])
C = constants.style.format({'name': '~~ {} ~~', 'value':'--> {:15.10f} <--'})
C

yang menampilkan

masukkan deskripsi gambar di sini

Ini adalah objek tampilan; DataFrame itu sendiri tidak mengubah pemformatan, tetapi pembaruan dalam DataFrame tercermin dalam tampilan:

constants.name = ['pie','eek']
C

masukkan deskripsi gambar di sini

Namun tampaknya ada beberapa keterbatasan:

  • Menambahkan baris dan / atau kolom baru di tempat tampaknya menyebabkan ketidakkonsistenan dalam tampilan gaya (tidak menambahkan label baris / kolom):

    constants.loc[2] = dict(name='bogus', value=123.456)
    constants['comment'] = ['fee','fie','fo']
    constants

masukkan deskripsi gambar di sini

yang terlihat ok tapi:

C

masukkan deskripsi gambar di sini

  • Pemformatan hanya berfungsi untuk nilai, bukan entri indeks:

    constants = pd.DataFrame([('pi',np.pi),('e',np.e)],
                   columns=['name','value'])
    constants.set_index('name',inplace=True)
    C = constants.style.format({'name': '~~ {} ~~', 'value':'--> {:15.10f} <--'})
    C

masukkan deskripsi gambar di sini

Jason S
sumber
2
Bisakah saya menggunakan DataFrame.style dari dalam interpreter?
Jms
23

Mirip dengan unutbu di atas, Anda juga dapat menggunakan applymapsebagai berikut:

import pandas as pd
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])

df = df.applymap("${0:.2f}".format)
sedeh
sumber
Saya suka menggunakan pendekatan ini sebelum menelepon df.to_csv()untuk memastikan semua kolom dalam .csvfile saya memiliki "lebar digit" yang sama. Terima kasih!
jeschwar
5

Saya suka menggunakan pandas.apply () dengan format python ().

import pandas as pd
s = pd.Series([1.357, 1.489, 2.333333])

make_float = lambda x: "${:,.2f}".format(x)
s.apply(make_float)

Selain itu, dapat dengan mudah digunakan dengan beberapa kolom ...

df = pd.concat([s, s * 2], axis=1)

make_floats = lambda row: "${:,.2f}, ${:,.3f}".format(row[0], row[1])
df.apply(make_floats, axis=1)
Selah
sumber
2

Anda juga dapat mengatur lokal ke wilayah Anda dan mengatur float_format untuk menggunakan format mata uang. Ini secara otomatis akan menetapkan tanda $ untuk mata uang di AS.

import locale

locale.setlocale(locale.LC_ALL, "en_US.UTF-8")

pd.set_option("float_format", locale.currency)

df = pd.DataFrame(
    [123.4567, 234.5678, 345.6789, 456.7890],
    index=["foo", "bar", "baz", "quux"],
    columns=["cost"],
)
print(df)

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
Vlad Bezden
sumber
0

ringkasan:


    df = pd.DataFrame({'money': [100.456, 200.789], 'share': ['100,000', '200,000']})
    print(df)
    print(df.to_string(formatters={'money': '${:,.2f}'.format}))
    for col_name in ('share',):
        df[col_name] = df[col_name].map(lambda p: int(p.replace(',', '')))
    print(df)
    """
        money    share
    0  100.456  100,000
    1  200.789  200,000

        money    share
    0 $100.46  100,000
    1 $200.79  200,000

         money   share
    0  100.456  100000
    1  200.789  200000
    """
Carson
sumber