0

我已经使用 Python 几个月了。现在,我必须对我的数据集(.csv 文件)的一列执行最小-最大规范化,我得到了上述类型错误。我已经尝试了很多但它仍然存在..为 min 和 max 函数检索正确的值,但结果的类型是列表而不是浮点/整数..

这是导致错误的行

for i in range(num):

         normalized[i]=(krr[i]-min(krr)/(max(krr)-min(krr))

其中 krr 是从数据集中检索到的列。请帮忙。

我有一个函数“正常”,它执行最小-最大规范化。我使用 eval 获取列值,如代码所示

def normal(self,arr,num):
    print("------------------->entered Normalisation block----------------->")
    for i in range(num):
   # trr=eval(str(arr[i]))[0:-31]
      self.krr[i]=map(float,eval(str(arr[i]))[0:-31])   //extracting one particular column
      #mn=min(self.krr)
      #mx=max(self.krr)

    print(self.krr)
    ls=min(self.krr)
    hs=max(self.krr)
    diff=hs-ls

    for i in range(num):
        normalized[i]=(self.krr[i]-ls)/diff
4

1 回答 1

0

好的,所以这里的关键问题是您正在处理一个子列表列表,每个子列表包含一个数字。

如果你看看你的公式:

(krr[i]-min(krr)/(max(krr)-min(krr))

正如您所提到的,python 可以处理最大值和最小值——它将返回包含最大/最小数字的子列表。(但请注意,获取包含一个数字的列表与仅获取一个数字非常不同)但是,不支持列表之间的减法和除法,因此您的错误消息。所以迟早,您需要从子列表中获取值。

我的建议是,在您完成构建 krr 之后,立即在代码中添加以下行:

krr = [element[0] for element in krr]

它将 krr 从子列表列表转换为每个子列表的第一个元素的列表。

编辑:

我认为可行且更有效的替代方法是改变

def normal(self,arr,num):
    print("------------------->entered Normalisation block----------------->")
    for i in range(num):
    # trr=eval(str(arr[i]))[0:-31]
        self.krr[i]=map(float,eval(str(arr[i]))[0:-31]) # This row

进入这个:

        self.krr[i]=float(eval(str(arr[i]))[0:-31][0])

map适用float于以下列表的每个元素,并创建一个新列表。相反,我们要求该列表的第一个元素,并float直接应用于它。该浮点数分配给 krr 中的索引。

PSeval(str(arr[i]))[0:-31]看起来很吓人——eval真的需要在这里调用吗?

于 2015-01-02T09:38:02.933 回答