我一直在使用Python几个月..现在,我必须为我的数据集(.csv文件)列执行min-max规范化,我得到上面提到的类型错误..我有尝试了很多,但它仍然存在..检查最小和最大函数的正确值,但结果的类型是列表而不是浮点数/整数..
这是导致错误的行
for i in range(num):
normalized[i]=(krr[i]-min(krr)/(max(krr)-min(krr))
其中krr是从数据集中检索的列。请帮助。
我有一个函数“normal”,它执行min-max规范化。 我使用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
答案 0 :(得分:0)
好的,所以这里的关键问题是您正在处理一个子列表列表,每个子列表包含一个数字。
如果你看一下你的公式:
(krr[i]-min(krr)/(max(krr)-min(krr))
正如您所提到的,python可以处理max和min - 它将返回包含最大/最小数字的子列表。 (虽然请注意,获取包含一个数字的列表与仅获取一个数字非常不同)但是,不支持列表之间的减法和除法,因此您的错误消息。所以迟早,你需要从子列表中获取值。
我的建议是,在完成构建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中的索引。
PS eval(str(arr[i]))[0:-31]
看起来很可怕 - 这里真的需要调用eval
吗?