【问题标题】:How to reserve at least 3 digits for a float number如何为浮点数保留至少 3 位数字
【发布时间】:2018-06-16 01:40:15
【问题描述】:

这是以前研究中的数据框示例:

输出数字的格式似乎至少为 3 位数(例如 1070、0.073)。目前,我只能将原始浮点数转换为点后格式相同的数据

str("{:.3f}".format(df['values'])

那么,如何将原始数据转化为上图的表格呢?

任何建议将不胜感激!

【问题讨论】:

  • 我想挑战你的假设。这些值没有显示为至少 3 位数字,它们代表了实际的测量精度。如果将测量值 7.5 显示为 7.50,则意味着比数据中的准确性更高。
  • 例如,特征“Sr”和“Lu”都可以修正为“0.xxx”。但表格显示为 5.03 和 0.004,均为 3 位数。
  • 但是7.54.3没有显示为7.504.30
  • 除了编码问题 - 不同化学元素的不同精度是否有任何理由?
  • 不同物种的测量方法相同。我怀疑检测限可能因物种而异。

标签: python python-2.7 pandas numpy


【解决方案1】:

您不能在浮点数末尾添加零并仍然保持浮点数。您必须首先将其表示更改为 string。然后,计算位数并在末尾添加零。如果数字最初不包含小数,请不要忘记添加 .

这导致了以下小功能。为了计算数字,我使用了一个正则表达式,所以它需要re

import re

def padZero(value, target_width):
    result = str(value)
    numdigits = len(re.findall(r"\d", result))
    if numdigits < target_width:
        if value == int(value):
            result += '.'
        while numdigits < target_width:
            numdigits += 1
            result += '0'
    return result

这个通用算法可以用更 Pythonic 的方式重写为:

def padZero(value, target_width):
    result = str(value)
    if 'e' not in result:
        numdigits = sum(n.isdigit() for n in result)
        if numdigits < target_width:
            if value == int(value):
                result += '.'
            result += '0'*(target_width - numdigits)
    return result

https://stackoverflow.com/a/12717649 的答案和评论中使用简洁的sum 技巧,很好地消除了re 的必要性,以及一个字符串乘法器来添加正确数量的0s。

在字符串表示中添加对e 的显式检查可防止非常大或非常小的数字(例如1e20)出现奇怪的结果,在这种情况下返回未更改的字符串。

 >>> print padZero(0.01, 4)
 0.010
 >>> print padZero(15,3)
 15.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多