背景:,我有一个SFrame,它包含数字,表示狗的图像与其他图像有多近。通常狗的图像应该是最接近另一只狗的图像,但重点是测试评估方法。
我的SFrame称为dog_distances (1000行x4列):
dog-automobile dog-bird dog-cat dog-dog
41.9579761457 41.7538647304 36.4196077068 33.4773590373
46.0021331807 41.3382958925 38.8353268874 32.8458495684
42.9462290692 38.6157590853 36.9763410854 35.0397073189
41.6866060048 37.0892269954 34.5750072914 33.9010327697
39.2269664935 38.272288694 34.778824791 37.4849250909
40.5845117698 39.1462089236 35.1171578292 34.945165344我想要写一个函数来检查狗狗是否是最低的数字,并将这个函数应用到整个SFrame中。
访问SFrame的一行通常会输出一个dict.sframe_namerow#
将.values()添加到该行的末尾,只会输出列表中的值。这允许您应用诸如min()或max()之类的数学方法,这对于创建函数is_dog_correct非常有用。
因此,我的职能是:
def is_dog_correct(row):
#checking if dog-dog is smallest value
if dog_distances[row]['dog-dog'] == min(dog_distances[row].values()):
return 1
else:
return 0我的函数接受输入中的行,如果该行的狗狗值等于该行中的min值,则返回1。如果这不是真,则返回0。
运行is_dog_correct(0)输出1。我们期望这样做,因为正如您在上面看到的,第零行的狗狗值是该行中最小的数字。
运行is_dog_correct(4)输出0。我们期望这一点,因为第零行的狗狗值不是该行中最小的数字。
因此,函数is_dog_correct在逐行的基础上完美地工作!
当我按照整个sFrame: dog_distances.apply(is_dog_correct)的建议运行时
我得到一个属性错误:
'SFrame' object has no attribute 'values'请有人解释为什么函数逐行工作,而不是在整个SFrame上工作?
发布于 2016-08-22 22:12:28
我想出了解决办法:
我认为问题在于,所有的文档都建议.apply()逐行进行。我假设这意味着,当它在给定的行上运行一个函数时,传递的变量是作为整数的行号。
实际上,传递给.apply()的变量/对象/文本是sframe_name[row_#]
因此,在您的函数中,如果您想访问/操作给定的索引
sframe_name[row_#]['column_name']一种通用形式是:
passed_variable['column_name']为了完全透明,在我的函数中,确切的代码是:
if dog-dog[row]['dog-bird'] <= dog-dog[row]['dog-dog']:当守则应该是:
if row['dog-bird'] <= row['dog-dog']:发布于 2018-03-23 20:27:25
SFrame中的每一行都是python字典,其中键是列名,值是列下的值。
所以我认为你应该先得到最低值的键,然后把它作为一个字符串来比较。如果是狗,则返回1,否则返回0。
像这样:
if min(dog_distances[#row], key=dog_distances.get) == "dog-dog": ## the first part of the line will return the column name
return 1
else:
return 0要使用apply(),您可以编写如下函数:
def min_row(row):
if min(row, key=row.get) == "dog-dog":
return 1
else:
return 0若要对数据使用此函数,请执行以下操作:
my_result = dog_distances.apply(min_row)
它将返回SArray
发布于 2016-08-22 08:40:48
请试试这个:
dog_distances['new_column'] = dog_distances.apply(lambda row: 1 if row['dog-dog'] == min(row.values()) else 0)添加
你好史蒂文
这段代码在我的笔记本电脑上正常工作。请参阅下面的链接。
https://stackoverflow.com/questions/39068428
复制相似问题