圆形熊猫数据框/系列

时间:2015-09-04 13:19:44

标签: python pandas dataframe

我在pandas数据框中有一个看起来像这样的列(更长但是这里是前几行):

>df_fill['col1']

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

我想将整列舍入到5位小数。我可以将它舍入为整数,但不能将小数点后的任何数字舍入。列的类型是float。

> np.around(df_fill['col1'], 0)

0      5988
1     52216
2       202
3         4

> np.around(df_fill['col1'], 5)

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

> (df_fill['col1']).round()

0      5988
1     52216
2       202
3         4

>(df_fill['col1']).round(5)

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

> (df_fill['col1']).round(decimals=5)

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

> str((df_fill['col1']).round(decimals=5))
'0      5987.8866699999998672865\n1     52215.5966699999989941716\n2       201.8966700000000003001\n3         3.8199999999999998401\

我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

浮动can only represent a subset of the real numbers。它只能精确地表示那些是2的负幂之和的小数(“二进制分数”)。 将浮点数舍入为5位数后,新浮点数可能不是具有5位小数的实数,因为小数部分可能无法精确表示为二进制小数。相反,舍入返回最接近该实数的浮点数

如果您已设置

pd.options.display.float_format = '{:.23g}'.format

然后Pandas将在其浮点字符串表示中显示最多23位数字:

import pandas as pd

pd.options.display.float_format = '{:.23g}'.format

df_fill = pd.DataFrame({'col1':[ 5987.8866699999998672865, 52215.5966699999989941716, 
                                201.8966700000000003001, 3.8199999999999998401]})

#                       col1
# 0 5987.8866699999998672865
# 1 52215.596669999998994172
# 2 201.89667000000000030013
# 3 3.8199999999999998401279

print(df_fill['col1'].round(5))
# 0   5987.8866699999998672865
# 1   52215.596669999998994172
# 2   201.89667000000000030013
# 3   3.8199999999999998401279
# Name: col1, dtype: float64

但是如果你将float_format设置为 display 5个十进制数字:

pd.options.display.float_format = '{:.5f}'.format

然后

print(df_fill['col1'].round(5))

产量

0    5987.88667
1   52215.59667
2     201.89667
3       3.82000
Name: col1, dtype: float64

注意底层浮动没有改变;只有它的显示方式。

答案 1 :(得分:1)

您的问题是由于表示浮点数的精度问题。数字5987.88667无法在float中精确表示,最接近的数字可以表示为5987.8866699999998672865。因此,您已经拥有与数组中所需数字最接近的数字,因此将其舍入到5位小数将不起作用。您已经有了正确的调用:

(df_fill['col1']).round(5)

如果您尝试舍入到2位小数,则可以看到它有效。所以我建议你不要担心。如果问题是如何在屏幕上显示数字,那么您可以将数字打印到字符串到正确的小数位数:

print "%.5f"%(df_fill['col1'])