0

背景:我有一个 SFrame,其中包含指示狗图像与其他图像的接近程度的数字。通常狗图像应该最接近另一个狗图像但重点是测试评估方法

我的 SFrame 称为 dog_distances(1000 行 x 4 列):

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

我想编写一个函数来检查 dog-dog 是否是最小的数字并将这个函数应用于整个 SFrame

访问 SFrame 的一行通常会输出一个字典... sframe_name[row#]['column_name']

将 .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

我的函数将 row 作为输入,如果该行的 dog-dog 值等于该行中的最小值,则返回 1。如果不是这样,则返回 0。

运行 is_dog_correct(0) 输出 1。我们期望这是因为,正如您在上面看到的,第 0 行的 dog-dog 中的值是该行中的最小值。

运行 is_dog_correct(4) 输出 0。我们期望这是因为 dog-dog 中第零行的值不是该行中的最小数字。

所以函数 is_dog_correct 可以在一行一行的基础上完美运行!

当我在整个 sFrame 上按照建议运行时: dog_distances.apply(is_dog_correct)

我收到一个属性错误:

'SFrame' object has no attribute 'values'

请有人解释为什么该函数逐行工作而不是在整个 SFrame 上工作?

4

4 回答 4

1

中的每一行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

于 2018-03-23T20:27:25.590 回答
0

我想出了解决方案:

我认为的问题是所有文档都表明 .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']:
于 2016-08-22T22:12:28.057 回答
0

我也遇到了同样的问题。当您在 SFrame 上使用 .apply() 时,它将 SFrame 的每一行作为字典传递。因此,在您的 is_dog_correct 函数中,将 row 视为字典。您可以使用 .values() 获取字典的值,然后找到它的最小值进行比较。如果 row['dog-dog'] 是最小值,您可以轻松地返回 True 或 False:

def is_dog_correct(row):
    return row['dog-dog'] == min(row.values())
于 2018-09-22T17:11:36.917 回答
0

请试试这个:

dog_distances['new_column'] = dog_distances.apply(lambda row: 1 if row['dog-dog'] == min(row.values()) else 0)

添加

嗨史蒂文,

此代码在我的笔记本电脑中正常工作。请参阅下面的链接。

  1. 您的数据(可能您的实际数据比这长得多)

  2. 应用 Lambda

    dog_distances['new_column'] = dog_distances.apply(lambda row: 1 if row['dog-dog'] == min(row.values()) else 0)

  3. 结果

于 2016-08-22T08:40:48.907 回答