pandas DataFrame中的自定义浮动格式

时间:2017-03-11 13:05:21

标签: python python-3.x pandas dataframe formatting

我有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选项?

请注意pd.options.display.float_format = '{:,.0f}'.format不起作用,因为它会给出固定数量的小数,而不是像我上面指出的DataFrame的条目那样变化。

5 个答案:

答案 0 :(得分:3)

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()方法非常慢,因为它为DataFrame中的每个系列执行map(func, series)

答案 1 :(得分:1)

一个很好的解决方案,用于测试该值是否具有小数部分并相应地对其进行格式化:

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)

答案 2 :(得分:1)

使用round()的简单方法,将要舍入的位数作为参数传递。

假设您的DataFrame名为“ df”:

df.round(2)

输出:

   0     1
0  3.00  5.60
1  1.20  3.45

答案 3 :(得分:1)

如果有人想要一种快速的方法对数据框中的所有数字类型应用相同的精度(同时不担心 str 类型):

pd.set_option('display.precision',3)

适用于在 jupyter 笔记本中显示 DataFrame 和 Styler 对象。

答案 4 :(得分:-2)

df["column"] = df["column"].astype("float").round(3)