鱼C论坛

 找回密码
 立即注册
查看: 3519|回复: 14

[已解决]保留小数点后几位数的操作疑问

[复制链接]
发表于 2019-5-13 13:53:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
要求保留小数点后3位数。
我执行了命令
  1. data['Lw'].apply(lambda x: '{:.3f}'.format(x))
复制代码

结果却一直都是按要求显示。。这是怎么回事?
1.png
最佳答案
2019-5-14 20:45:57
本帖最后由 在东边 于 2019-5-14 20:54 编辑
老笨啊 发表于 2019-5-14 19:57
那我直接用round函数,再赋值给原来的列,可以吗?


因为 round(1.23, 3) 还是 1.23
所以如果你的原始数据只保留了 2 位小数,用 round 函数是没办法保留 3 位的
用 lambda x: '{:.3f}'.format(x) 确实可以保留 3 位小数,不过得到的结果变成了字符串
如果你后面还要对它进行数学运算的话,是没法直接进行的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-13 14:49:51 | 显示全部楼层
取返回值看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-13 14:51:48 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-13 14:53 编辑

    用 round() 岂不更简单?
  1. print(round(Lw , 3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-13 15:01:26 | 显示全部楼层
jackz007 发表于 2019-5-13 14:51
用 round() 岂不更简单?

也是可以的。。
我也试过,返回都是做不到要求。。所以才试了这个做法。。
结果还是不行。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-13 15:09:05 | 显示全部楼层

5.png

貌似还是这样。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 18:55:26 | 显示全部楼层
apply 方法是有返回值的,你得把结果进行赋值
  1. data['Lw'] = data['Lw'].apply(lambda x: '{:.3f}'.format(x))
复制代码

然后再打印 data 看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-14 19:57:51 | 显示全部楼层
在东边 发表于 2019-5-14 18:55
apply 方法是有返回值的,你得把结果进行赋值

然后再打印 data 看看

那我直接用round函数,再赋值给原来的列,可以吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-14 20:45:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 在东边 于 2019-5-14 20:54 编辑
老笨啊 发表于 2019-5-14 19:57
那我直接用round函数,再赋值给原来的列,可以吗?


因为 round(1.23, 3) 还是 1.23
所以如果你的原始数据只保留了 2 位小数,用 round 函数是没办法保留 3 位的
用 lambda x: '{:.3f}'.format(x) 确实可以保留 3 位小数,不过得到的结果变成了字符串
如果你后面还要对它进行数学运算的话,是没法直接进行的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-15 09:46:38 | 显示全部楼层
在东边 发表于 2019-5-14 20:45
因为 round(1.23, 3) 还是 1.23
所以如果你的原始数据只保留了 2 位小数,用 round 函数是没办法保留  ...

哦,也就是说,如果原始数值是保留2位小数,用round函数设置成3位小数,后面是不会填充0的。
而用format方法,则是强制转换成字符串格式,再后面强加一个0?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-15 13:55:18 From FishC Mobile | 显示全部楼层
老笨啊 发表于 2019-5-15 09:46
哦,也就是说,如果原始数值是保留2位小数,用round函数设置成3位小数,后面是不会填充0的。
而用format ...

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-16 12:01:11 | 显示全部楼层

再请教下,我用format办法,的确将数值转成了指定的小数位数。。
但是如果再转回来浮点型,小数后面的0又会被自动省略。。有什么办法在浮点型下,保证小数点的位数吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-16 16:26:06 | 显示全部楼层
老笨啊 发表于 2019-5-16 12:01
再请教下,我用format办法,的确将数值转成了指定的小数位数。。
但是如果再转回来浮点型,小数后面的0 ...

Python解释器认为 1.23 和 1.230000 大小是一样的
那么干脆就把 1.230000 后面的 0 省略了,直至最后那位数字不为 0,而且这样做并不会影响数字间的数学运算
但是在 pandas 中,是可以通过设置 pd.options.display.float_format(默认为 None) 来指定浮点数的保留位数
1.png
2.png
如上面两张图所示
首先,我创建了一个 3 行 3 列的 DataFrame,a 列保留 1 位小数,b 列保留 2 位小数,c 列是整数
然后,我设置了 pd.options.display.float_format = '{:.4f}'.format
那么可以看到 a 列和 b 列都保留了 4 位小数,且它们的类型还是跟之前一样,并没有变成字符串类型
这里需要注意一个问题,之后只要是 pandas 的数据结构(比如 DataFrame、Series)里出现了浮点数,都会保留到小数点后 4 位
如果想要浮点数的显示和默认情况一样,只要设置 pd.options.display.float_format 为 None 即可
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-16 19:00:18 | 显示全部楼层
在东边 发表于 2019-5-16 16:26
Python解释器认为 1.23 和 1.230000 大小是一样的
那么干脆就把 1.230000 后面的 0 省略了,直至最后那 ...

哦,就是pandas中默认对浮点型数值,保留4位小数。如果要保留其他位数的小数的话,就要用你所的options方法。。
可是我看到经过公式计算后,得到的浮点型数,并非都是小数点后4位啊?基本都是默认省略尾部的数值0.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-16 19:54:21 | 显示全部楼层
老笨啊 发表于 2019-5-16 19:00
哦,就是pandas中默认对浮点型数值,保留4位小数。如果要保留其他位数的小数的话,就要用你所的options方 ...

我并没有说 pandas 默认对浮点数保留 4 位小数。。。
默认情况下,pandas 对浮点型数值的保留位数和这个数值所在列的最大保留位数相同
比如说 df = pd.DataFrame({'a': [1.1, 2.22, 3.333]})
这个 df 中,1.1 就会显示成 1.100,2.2 就会显示成 2.220,因为 3.333 保留了 3 位小数,为了对齐,1.1 和 2.2 也会保留 3 位小数

以上是默认情况,也就是没有设置 pd.options.display.float_format
如果你想设置成保留到小数点后 10 位,就执行 pd.options.display.float_format = '{:.10f}'.format
这时再打印 df,数据后面的 0 就会显示出来


至于公式计算后的结果,还是拿上面的 df 为例
在没有设置 pd.options.display.float_format 的情况下
假设你要用 df.mean() 计算均值,你会得到 a 列的均值为 2.217667(事实上应该是 2.21766666....无限循环下去)
而它只显示到小数点后 6 位,这是因为 pandas 中对浮点数的精度默认为 6,这点可以查看变量 pd.options.display.precision 得知

如果你设置了 pd.options.display.float_format 为 '{:.2f}'.format
那 df.mean() 得到的 a 列均值就显示成 2.2,但它实际上还是 2.21766666.....
这点你可以单独打印 df.mean()[0] 就可以看出来

总的来说,就是 pd.options.display.float_format 控制 pandas 中浮点数显示的格式
而保留几位小数,这个其实就是浮点数精度问题,严格来说是由 pd.options.display.precision 控制的
这个问题不用太纠结啦...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-17 09:34:39 | 显示全部楼层
在东边 发表于 2019-5-16 19:54
我并没有说 pandas 默认对浮点数保留 4 位小数。。。
默认情况下,pandas 对浮点型数值的保留位数和这个 ...

嗯,好的,谢谢。
又学了新知识~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 11:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表