วิธีการแสดง DataFrame ของแพนด้าลอยโดยใช้สตริงรูปแบบสำหรับคอลัมน์?


166

ผมอยากจะแสดง dataframe หมีแพนด้าที่มีรูปแบบที่กำหนดโดยใช้print()และ display()IPython ตัวอย่างเช่น:

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

ฉันต้องการบีบบังคับสิ่งนี้ในการพิมพ์

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

โดยไม่ต้องแก้ไขข้อมูลเองหรือสร้างสำเนาเพียงแค่เปลี่ยนวิธีการแสดงข้อมูล

ฉันจะทำสิ่งนี้ได้อย่างไร


2
เป็นcostเพียงลอยคอลัมน์หรือมีคอลัมน์ลอยอื่น ๆ ที่ไม่ควรจะจัดรูปแบบด้วย$?
unutbu

ฉันต้องการที่จะทำมันสำหรับคอลัมน์ค่าใช้จ่ายเท่านั้น (ข้อมูลจริงของฉันมีคอลัมน์อื่น ๆ )
เจสัน S

ฉันตระหนักว่าเมื่อมีการแนบ $ $ ชนิดข้อมูลจะเปลี่ยนเป็นวัตถุโดยอัตโนมัติ
อัล

คำตอบ:


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)

อัตราผลตอบแทน

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

แต่จะใช้งานได้เฉพาะในกรณีที่คุณต้องการให้ฟอร์แมตทุกโฟลตมีเครื่องหมายดอลลาร์

มิฉะนั้นถ้าคุณต้องการจัดรูปแบบดอลล่าร์สำหรับบางฟลัดเท่านั้นฉันคิดว่าคุณจะต้องแก้ไขดาต้าเฟรมก่อน

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)

อัตราผลตอบแทน

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

3
วิธีการแก้ปัญหานี้ยังคงทำงานได้อย่างถูกต้องสำหรับฉันเป็นของแพนด้า 0.22
เทย์เลอร์ Edmiston

19
ตามที่ปรากฏเช่นที่นี่คุณสามารถแก้ไขตัวเลือกเฉพาะสำหรับบล็อกที่กำหนดโดยใช้with pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner

1
พิเศษ'ก่อนวงเล็บปิดที่ความคิดเห็นของ @AndreHolzner; มิฉะนั้นมันจะทำงานเหมือนมีเสน่ห์!
dTanMan

67

หากคุณไม่ต้องการแก้ไขดาต้าเฟรมคุณสามารถใช้ฟอร์แมตเตอร์แบบกำหนดเองสำหรับคอลัมน์นั้นได้

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

อัตราผลตอบแทน

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

2
เป็นไปได้ไหมที่ฟอร์แมตเตอร์จะทำงานบนคอลัมน์หลายระดับ?
2579685

3
AFAICT ตัวอย่างนี้ใช้งานได้โดยไม่มีบรรทัดที่สองpd.options.display.float_format = '${:,.2f}'.format
pianoJames

56

จาก Pandas 0.17 ขณะนี้มีระบบจัดแต่งทรงผมที่ให้มุมมองการจัดรูปแบบของ DataFrame โดยใช้สตริงการจัดรูปแบบ 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

ซึ่งจะแสดง

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือวัตถุมุมมอง DataFrame เองไม่เปลี่ยนการจัดรูปแบบ แต่การอัพเดทใน DataFrame จะแสดงให้เห็นในมุมมอง:

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

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามดูเหมือนว่าจะมีข้อ จำกัด :

  • การเพิ่มแถวและ / หรือคอลัมน์ใหม่ในสถานที่ดูเหมือนจะทำให้เกิดความไม่สอดคล้องกันในมุมมองที่มีสไตล์ (ไม่เพิ่มป้ายชื่อแถว / คอลัมน์):

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

ป้อนคำอธิบายรูปภาพที่นี่

ซึ่งดูโอเค แต่:

C

ป้อนคำอธิบายรูปภาพที่นี่

  • การจัดรูปแบบใช้ได้กับค่าเท่านั้นไม่ใช่รายการดัชนี:

    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

ป้อนคำอธิบายรูปภาพที่นี่


2
ฉันสามารถใช้ DataFrame.style จากภายในล่ามได้หรือไม่
Jms

23

คล้ายกับ unutbu ด้านบนคุณสามารถใช้applymapดังนี้:

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)

ฉันชอบใช้วิธีนี้ก่อนโทรdf.to_csv()เพื่อให้แน่ใจว่าคอลัมน์ทั้งหมดใน.csvไฟล์ของฉันมี "ความกว้างหลัก" เหมือนกัน ขอบคุณ!
jeschwar

5

ฉันชอบใช้ pandas.apply () ด้วยรูปแบบหลาม ()

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

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

นอกจากนี้ยังสามารถใช้กับหลายคอลัมน์ได้อย่างง่ายดาย ...

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

นอกจากนี้คุณยังสามารถตั้งค่าภาษาในภูมิภาคของคุณและตั้งค่า float_format ให้ใช้รูปแบบสกุลเงิน สิ่งนี้จะกำหนด $ sign สำหรับสกุลเงินในสหรัฐอเมริกาโดยอัตโนมัติ

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

สรุป:


    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
    """
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.