将比率转换为浮点数

时间:2016-06-28 04:14:30

标签: python python-3.x

我有一个" x:y"形式的数据列表,我试图将其转换为浮点数x / y。以下是我的代码

def ratio_to_float (ratio):
    [numer,denum] = ratio.split(" : ")
    if int(denum) == 0:
        num = math.inf
    else:
        num = int(numer)/int(denum)
    return num

但是,我一直收到以下错误

[numer,denum] = ratio.split(" : ")
     

ValueError:没有足够的值来解包(预期2,得到1)

但是,我最后一次检查时,列表仍然是" x:y"的形式。有人可以告诉我我的代码的哪一部分导致了这个错误?任何帮助表示赞赏。 (:

编辑:我实际上有一个来自pandas库的Series类型对象,它包含这些比率的字符串。我的输入是lst.map(ratio_to_float,na_action ="忽略")。

我也尝试了前5个条目,它们似乎运作良好。

4 个答案:

答案 0 :(得分:1)

您收到的错误表明split仅在某个时刻返回单值列表。这意味着在程序运行的某个地方,它会使用一个不包含" : "的字符串调用您的函数。如果你在一个比率列表上运行,可能有一个是畸形的(也许是缺少一个空格)。或者,如果您正在读取文件,也许最后一行是空字符串?

要解决此问题,您可以尝试在try周围放置except / split块并解压缩,并在发生异常时打印一些诊断信息:

def ratio_to_float (ratio):
    try:
        numer, denum = ratio.split(" : ")
    except ValueError:
        print(repr(ratio))
        raise
    if int(denum) == 0:
        num = math.inf
    else:
        num = int(numer)/int(denum)
    return num

答案 1 :(得分:0)

.split(":")删除空格。

代码:

def ratio_to_float(ratio):
    numer,denum = ratio.split(":")
    if int(denum) == 0:
        num = math.inf
        print(num)
    else:
        num = int(numer)/int(denum)
        print(num)
    return num

ratio_to_float("10:5")

输出:2

如果您正在阅读比率列表:

def ratio_to_float(ratio):
    res=[]
    for r in ratio:
        [numer,denum] = r.split(":")
        numer=int(numer)
        denum=int(denum)
        if denum == 0:
            num = math.inf
        else:
            num = (numer)/(denum)
        res.append(num)
    return res

print(ratio_to_float(["10:5", "5:2"]))

输出:

[2.0, 2.5]

答案 2 :(得分:0)

你也可以通过制作一个List来做到这一点。 使用列表的主要原因是,您可以采用多个浮动数字并通过迭代获得结果。
spaceratio.split(" : ")移至ratio.split(":")

def ratio_to_float(ratio):
    numer = ratio.split(":").list
    if int(numer[1]) == 0:
        num = math.inf
        print(num)
    else:
        num = int(numer[0])/int(numer[1])
        print(num)
    return num

答案 3 :(得分:0)

如果您正在使用pandas系列,那么请点击此处。您可以使用内置的fractions.Fraction类和一些字符串操作来完成提升......

import pandas as pd
from fractions import Fraction

s = pd.Series(["37 : 63", "100 : 0", "45 : 55"])

def ratio_to_float(value):
    # Change : to / and remove spaces...
    if not isinstance(value, str):
        return value
    s = value.translate(str.maketrans(':', '/', ' '))
    try:
        # Let's see if the Fraction class can handle it
        return float(Fraction(s))
    except ZeroDivisionError:
        return pd.np.nan # or whatever...

然后使用:

s.map(ratio_to_float)

给你:

0    0.587302
1         NaN
2    0.818182
dtype: float64