私はDataFrame
を持っています:
0 1
0 3.000 5.600
1 1.200 3.456
プレゼンテーションの目的で、に変換してほしい
0 1
0 3 5.6
1 1.2 3.456
これを達成するためのエレガントな方法は何ですか(DataFrame
のエントリを非効率的にループすることなく)?
またはおそらくもっと一般的に:常にこれを行うようにpandas
を設定する方法はありますか?例えば。 pandas
オプションの1つ?
pd.options.display.float_format = '{:,.0f}'.format
は、上記のようにDataFrame
のエントリ間で変化するのではなく、固定の小数点以下の桁数を与えるため、機能しないことに注意してください。
_In [188]: df
Out[188]:
a b c
0 1.0000 2.2460 2.0000
1 3.0000 4.4920 6.0000
2 5.0000 6.7380 10.0000
In [189]: pd.options.display.float_format = '{:,.2f}'.format
In [190]: df.apply(lambda x: x.astype(int) if np.allclose(x, x.astype(int)) else x)
Out[190]:
a b c
0 1 2.25 2
1 3 4.49 6
2 5 6.74 10
_
更新:
_In [222]: df
Out[222]:
0 1
0 3.0000 5.6000
1 1.2000 3.4560
In [223]: df.applymap(lambda x: str(int(x)) if abs(x - int(x)) < 1e-6 else str(round(x,2)))
Out[223]:
0 1
0 3 5.6
1 1.2 3.46
_
注:。applymap() メソッドはそれぞれに対してmap(func, series)
を実行するため、かなり遅いことに注意してくださいDataFrameのシリーズ
round()を使用する単純なメソッドで、丸める桁数をパラメーターとして渡します。
DataFrameの名前が「df」であると仮定します。
df.round(2)
出力:
0 1
0 3.00 5.60
1 1.20 3.45
値に小数部分があるかどうかをテストし、それに応じてフォーマットするための良い解決策:
_pd.options.display.float_format = lambda x : '{:.0f}'.format(x) if int(x) == x else '{:,.2f}'.format(x)
_
編集:これは、NaNがデータにある場合にエラーを生成します。代わりにround()の使用を検討してください:pd.options.display.float_format = lambda x : '{:.0f}'.format(x) if round(x,0) == x else '{:,.2f}'.format(x)