Sütunlar için bir biçim dizesi kullanarak yüzen pandalar DataFrame nasıl görüntülenir?


166

Ben kullanarak belirli bir format print()ve IPython ile bir pandalar veri çerçevesi görüntülemek istiyorum display(). Örneğin:

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

Bunu bir şekilde baskıya zorlamak istiyorum

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

verilerin kendisini değiştirmek veya bir kopya oluşturmak zorunda kalmadan, görüntülenme şeklini değiştirin.

Bunu nasıl yapabilirim?


2
Is costsadece sütunu yüzer veya biçimlendirilmiş edilmemelidir orada başka şamandıra sütunları vardır $?
unutbu

Bunu yalnızca maliyet sütunu için yapmak istiyorum (gerçek verilerimin başka sütunları var)
Jason S

i $ eklendikten sonra veri türünün otomatik olarak nesneye değiştiğini anlıyorum.
Nguai al

Yanıtlar:


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)

verim

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

ancak bu yalnızca her şamandıranın bir dolar işareti ile biçimlendirilmesini istiyorsanız çalışır .

Aksi takdirde, sadece bazı şamandıralar için dolar biçimlendirme istiyorsanız, o zaman veri çerçevesini (bu şamandıraları dizelere dönüştürerek) önceden değiştirmek zorunda kalacağınızı düşünüyorum:

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)

verim

         cost       foo
foo   $123.46  123.4567
bar   $234.57  234.5678
baz   $345.68  345.6789
quux  $456.79  456.7890

3
Bu çözüm benim için panda 0.22'den itibaren hala düzgün çalışıyor.
Taylor Edmiston

19
Burada gösterildiği gibi , sadece verilen bir blok için seçenekleri aşağıdakileri kullanarak değiştirebilirsinizwith pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner

1
'@AndreHolzner yorumunda kapanış parantezinden önce ekstra ; Aksi takdirde, bir cazibe gibi çalışır!
dTanMan

67

Veri çerçevesini değiştirmek istemiyorsanız, bu sütun için özel bir biçimlendirici kullanabilirsiniz.

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})

verim

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

2
Biçimlendiricinin çok düzeyli bir sütun üzerinde çalışmasını sağlamak mümkün müdür?
user2579685

3
AFAICT, bu örnek ikinci satır olmadan çalışırpd.options.display.float_format = '${:,.2f}'.format
pianoJames

56

Pandalar 0.17'den itibaren artık temel olarak Python biçim dizelerini kullanarak bir DataFrame'in biçimlendirilmiş görünümlerini sağlayan bir şekillendirme sistemi var :

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

hangi görüntüler

resim açıklamasını buraya girin

Bu bir görüntüleme nesnesidir; DataFrame'in kendisi biçimlendirmeyi değiştirmez, ancak DataFrame'deki güncellemeler görünüme yansıtılır:

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

resim açıklamasını buraya girin

Ancak bazı sınırlamaları var gibi görünüyor:

  • Yerinde yeni satırlar ve / veya sütunlar eklemek, stil görünümünde tutarsızlığa neden oluyor gibi görünüyor (satır / sütun etiketleri eklemiyor):

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

resim açıklamasını buraya girin

Tamam görünüyor ama:

C

resim açıklamasını buraya girin

  • Biçimlendirme, dizin girişleri için değil, yalnızca değerler için çalışır:

    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

resim açıklamasını buraya girin


2
DataFrame.style'i yorumlayıcının içinden kullanabilir miyim?
Jms

23

Yukarıdaki unutbu'ya benzer şekilde, applymapaşağıdaki gibi de kullanabilirsiniz :

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)

Dosyamdaki df.to_csv()tüm sütunların .csvaynı "basamak genişliğine" sahip olduğundan emin olmak için aramadan önce bu yaklaşımı kullanmayı seviyorum . Teşekkürler!
jeschwar

5

Python formatı () ile pandas.apply () kullanmayı seviyorum.

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

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

Ayrıca, birden çok sütunla kolayca kullanılabilir ...

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)

2

Ayrıca bölgenize yerel ayar belirleyebilir ve float_format öğesini bir para birimi biçimi kullanacak şekilde ayarlayabilirsiniz. Bu, ABD'de para birimi için otomatik olarak $ işareti ayarlayacaktır.

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

0

özet:


    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
    """
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.