簡體   English   中英

如何使用列的格式字符串顯示浮點數的 Pandas DataFrame?

[英]How to display pandas DataFrame of floats using a format string for columns?

我想使用print()和 IPython display()具有給定格式的熊貓數據框。 例如:

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

無需修改數據本身或創建副本,只需更改其顯示方式即可。

我怎樣才能做到這一點?

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

如果您不想修改數據框,則可以為該列使用自定義格式化程序。

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

從 Pandas 0.17 開始,現在有一個樣式系統,它基本上使用Python 格式字符串提供 DataFrame 的格式化視圖:

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

在此處輸入圖片說明

與上面的 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)

我喜歡將 pandas.apply() 與 python format() 結合使用。

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)

您可以使用DataFrame.style.format並且只設置一個數據框的渲染樣式,而不是弄亂pd.options並全局影響數據框的渲染。

df.style.format({
  'cost': lambda val: f'${val:,.2f}',
})

>>>
>>>            cost
>>> ---------------
>>> foo   $123.4567
>>> bar   $234.5678
>>> baz   $345.6789
>>> quux   $456.789

解釋

函數df.style.format接受一個字典,它的鍵映射到你想要設置樣式的列名,並且該值是一個可調用的,它接收指定列的每個值,並且必須返回一個字符串,表示格式化的值. 這只影響數據框的渲染,不會改變底層數據。

如果您不想永久更改顯示格式,並且可能稍后應用新格式,我個人更喜歡使用資源管理器(Python 中的with語句)。 在您的情況下,您可以執行以下操作:

with pd.option_context('display.float_format', '${:0.2f}'.format):
   print(df)

如果您碰巧需要在代碼中進一步使用不同的格式,您可以通過改變上面代碼片段中的格式來更改它。

您還可以將語言環境設置為您所在的地區,並將 float_format 設置為使用貨幣格式。 這將自動為美國的貨幣設置 $ 符號。

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

總結:


    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
    """

現在,我首選的解決方案是使用上下文管理器來顯示數據框:

with pd.option_context('display.float_format', '${:,.2f}'.format):
    display(df)

該格式僅對顯示此數據框有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM