列のフォーマット文字列を使用してフロートのパンダデータフレームを表示する方法


164

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

データ自体を変更したり、コピーを作成したりすることなく、データの表示方法を変更するだけです。

これどうやってするの?


2
あるcostだけフロート列、またはそこでフォーマットされてはならない、他のフロートコラムですか$
unutbu 2014年

コスト列のみに適用したい(私の実際のデータには他の列がある)
Jason S

$がアタッチされると、データ型が自動的にオブジェクトに変わることに気づきました。
Nguai al

回答:


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
このソリューションは、pandas 0.22の時点でもまだ適切に機能します。
テイラーエドミストン2018

19
たとえば、ここに示すように、次のwith pd.option_context('display.float_format', '${:,.2f}'.format'):
コマンド

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
フォーマッターをマルチレベル列で機能させることは可能ですか?
user2579685

3
AFAICT、この例は2行目なしで機能しますpd.options.display.float_format = '${:,.2f}'.format
pianoJames

55

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

ここに画像の説明を入力してください


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 2018年

5

私はpython format()で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を設定して通貨形式を使用することもできます。これにより、米国の通貨に$記号が自動的に設定されます。

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.