Làm cách nào để hiển thị pandas DataFrame của float bằng chuỗi định dạng cho các cột?


164

Tôi muốn hiển thị một khung dữ liệu gấu trúc với định dạng đã cho bằng cách sử dụng print()và IPython display(). Ví dụ:

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

Tôi muốn bằng cách nào đó ép buộc điều này vào in ấn

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

mà không phải sửa đổi dữ liệu hoặc tạo một bản sao, chỉ cần thay đổi cách hiển thị.

Tôi có thể làm cái này như thế nào?


2
costcột float duy nhất, hoặc có các cột float khác không nên được định dạng với $?
unutbu

Tôi chỉ muốn làm điều đó cho cột chi phí (dữ liệu thực của tôi có các cột khác)
Jason S

tôi nhận ra rằng một khi $ được đính kèm, kiểu dữ liệu sẽ tự động thay đổi thành đối tượng.
Nguai al

Câu trả lời:


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)

sản lượng

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

nhưng điều này chỉ hoạt động nếu bạn muốn mọi float được định dạng bằng ký hiệu đô la.

Mặt khác, nếu bạn chỉ muốn định dạng đô la cho một số số float, thì tôi nghĩ bạn sẽ phải sửa đổi trước khung dữ liệu (chuyển đổi các số float đó thành chuỗi):

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)

sản lượng

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

3
Giải pháp này vẫn hoạt động đúng với tôi như gấu trúc 0,22.
Taylor Edmiston

19
như được hiển thị, ví dụ ở đây , bạn chỉ có thể sửa đổi các tùy chọn cho một khối nhất định bằng cách sử dụngwith pd.option_context('display.float_format', '${:,.2f}'.format'):
Andre Holzner

1
Thêm 'trước dấu ngoặc đơn đóng trên nhận xét của @AndreHolzner; nếu không, nó hoạt động như một bùa mê!
dTanMan

67

Nếu bạn không muốn sửa đổi khung dữ liệu, bạn có thể sử dụng một trình định dạng tùy chỉnh cho cột đó.

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

sản lượng

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

2
Có thể có được bộ định dạng để làm việc trên một cột đa cấp không?
dùng2579685

3
AFAICT, ví dụ này hoạt động mà không có dòng thứ haipd.options.display.float_format = '${:,.2f}'.format
pianoJames

55

Kể từ Pandas 0.17, giờ đây có một hệ thống kiểu dáng về cơ bản cung cấp các khung nhìn được định dạng của DataFrame bằng các chuỗi định dạng 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

màn hình hiển thị

nhập mô tả hình ảnh ở đây

Đây là một đối tượng xem; Bản thân DataFrame không thay đổi định dạng, nhưng các cập nhật trong DataFrame được phản ánh trong dạng xem:

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

nhập mô tả hình ảnh ở đây

Tuy nhiên, nó có một số hạn chế:

  • Thêm hàng mới và / hoặc cột tại chỗ dường như gây ra sự không nhất quán trong chế độ xem theo kiểu (không thêm nhãn hàng / cột):

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

nhập mô tả hình ảnh ở đây

Có vẻ ổn nhưng:

C

nhập mô tả hình ảnh ở đây

  • Định dạng chỉ hoạt động cho các giá trị, không phải mục chỉ mụ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

nhập mô tả hình ảnh ở đây


2
Tôi có thể sử dụng DataFrame.style từ bên trong trình thông dịch không?
Jms

23

Tương tự như unutbu ở trên, bạn cũng có thể sử dụng applymapnhư sau:

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)

Tôi thích sử dụng phương pháp này trước khi gọi df.to_csv()để đảm bảo tất cả các cột trong .csvtệp của tôi có cùng "chiều rộng chữ số". Cảm ơn!
jeschwar

5

Tôi thích sử dụng pandas.apply () với định dạng 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)

Ngoài ra, nó có thể dễ dàng được sử dụng với nhiều cột ...

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

Bạn cũng có thể đặt ngôn ngữ cho khu vực của mình và đặt float_format để sử dụng định dạng tiền tệ. Điều này sẽ tự động đặt ký hiệu $ cho tiền tệ ở Hoa Kỳ.

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

tóm lược:


    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
    """
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.