web-dev-qa-db-ja.com

列にフォーマット文字列を使用してfloatのパンダDataFrameを表示する方法?

私は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

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

これどうやってするの?

122
Jason S
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

しかし、これはevery floatをドル記号でフォーマットしたい場合にのみ機能します。

そうではなく、一部の浮動小数点数だけにドル書式を設定したい場合は、データフレームを事前に変更する必要があると思います(これらの浮動小数点数を文字列に変換する)。

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
209
unutbu

データフレームを変更したくない場合は、その列にカスタムフォーマッタを使用できます。

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
62
Chris Moore

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

どの表示

enter image description here 

これはビューオブジェクトです。 DataFrame自体はフォーマットを変更しませんが、DataFrameの更新はビューに反映されます。

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

enter image description here 

ただし、いくつかの制限があります。

  • 新しい行や列をインプレースで追加すると、スタイル付きビューで矛盾が生じるようです(行/列ラベルを追加しないでください)。

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

enter image description here 

それは大丈夫に見えますが:

C

enter image description here 

  • フォーマットは値に対してのみ機能し、インデックスエントリに対しては機能しません。

    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
    

enter image description here 

33
Jason S

上記の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)
17
sedeh

私は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)
1
Selah

概要:


    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
    """
0
Carson Arucard