web-dev-qa-db-ja.com

pandas DataFrameでカスタマイズされたフロートフォーマット

私は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のエントリ間で変化するのではなく、固定の小数点以下の桁数を与えるため、機能しないことに注意してください。

4
splinter
_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のシリーズ

3
MaxU

round()を使用する単純なメソッドで、丸める桁数をパラメーターとして渡します。

DataFrameの名前が「df」であると仮定します。

df.round(2)

出力:

   0     1
0  3.00  5.60
1  1.20  3.45
1
Simas

値に小数部分があるかどうかをテストし、それに応じてフォーマットするための良い解決策:

_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)

1
SEDaradji