私は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
しかし、これは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
データフレームを変更したくない場合は、その列にカスタムフォーマッタを使用できます。
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)
私は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)
概要:
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
"""