首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SFrame问题上使用apply()方法

在SFrame问题上使用apply()方法
EN

Stack Overflow用户
提问于 2016-08-21 20:11:19
回答 4查看 1.6K关注 0票数 0

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

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

代码语言:javascript
复制
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非常有用。

因此,我的职能是:

代码语言:javascript
复制
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)的建议运行时

我得到一个属性错误:

代码语言:javascript
复制
'SFrame' object has no attribute 'values'

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-22 22:12:28

我想出了解决办法:

我认为问题在于,所有的文档都建议.apply()逐行进行。我假设这意味着,当它在给定的行上运行一个函数时,传递的变量是作为整数的行号。

实际上,传递给.apply()的变量/对象/文本是sframe_name[row_#]

因此,在您的函数中,如果您想访问/操作给定的索引

代码语言:javascript
复制
sframe_name[row_#]['column_name']

一种通用形式是:

代码语言:javascript
复制
passed_variable['column_name']

为了完全透明,在我的函数中,确切的代码是:

代码语言:javascript
复制
if dog-dog[row]['dog-bird'] <= dog-dog[row]['dog-dog']:

当守则应该是:

代码语言:javascript
复制
if row['dog-bird'] <= row['dog-dog']:
票数 0
EN

Stack Overflow用户

发布于 2018-03-23 20:27:25

SFrame中的每一行都是python字典,其中键是列名,值是列下的值。

所以我认为你应该先得到最低值的键,然后把它作为一个字符串来比较。如果是狗,则返回1,否则返回0

像这样:

代码语言:javascript
复制
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(),您可以编写如下函数:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2016-08-22 08:40:48

请试试这个:

代码语言:javascript
复制
dog_distances['new_column'] = dog_distances.apply(lambda row: 1 if row['dog-dog'] == min(row.values()) else 0)

添加

你好史蒂文

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

  1. Your data (可能实际数据比这个长得多)
  2. 应用Lambda dog_distances.apply(lambda行:1 if行“狗-狗”== min(row.values()) row 0)
  3. Result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39068428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档