3

我有一个简码如下。尝试使用.apply来调用一个函数。但它总是给我一个错误,说该函数不可调用。

def awesome_count():
    return 10
products['awesome'] = products['word_count'].apply(awesome_count())

AssertionError Traceback (most recent call last)
<ipython-input-45-493b4bfe94cc> in <module>()
----> 1 products['awesome'] = products['word_count'].apply(awesome_count())

C:\Users\twu\AppData\Local\Dato\Dato Launcher\lib\site-packages\graphlab\data_structures\sarray.pyc in apply(self, fn, dtype, skip_undefined, seed)
   1598         [0.0, 1.0, 2.0]
   1599         """
-> 1600         assert callable(fn), "Input function must be callable."
   1601 
   1602         dryrun = [fn(i) for i in self.head(100) if i is not None]

AssertionError: Input function must be callable.

有人可以帮帮我吗?

4

7 回答 7

14

我认为有几件事可以帮助您解决这个问题。第一个是将“awesome_count”函数转换为 lambda 函数。假设 awesome_count 的目标是返回单词“awesome”出现的次数,我知道 products['word_count'] 包含单词和计数的字典(即“and”=> 5,“awesome”= > 2, "awful = "1")。这里的辛苦工作已经为你完成了,因为你拥有 products['word_count'] 中的所有计数。唯一需要注意的是你正在寻找的单词for 可能不存在于列表中。

def awesome_count():
   if 'awesome' in products['word_count']:
       return products['word_count']['awesome']
   else
       return 0L

这里的函数检查单词列表中是否有“awesome”。如果是,那么我们只返回 products['word_count']['awesome'](即 awesome 出现的次数)。如果 'awesome' 不存在,那么我们默认为 0。

所以让我们把它变成一个lambda。根据他的说法:

products['awesome'] = products['word_count'].apply(awesome_count())

对 lambda 函数的每次调用都传入 products['word_count']。在我们的 lambda 函数中,这将是 x。

lambda x: x['awesome'] if 'awesome' in x else 0L

这与上面相同,但采用 lambda 格式。因此,将其结合起来:

products['awesome'] = products['word_count'].apply(lambda x: x['awesome'] if 'awesome' in x else 0L) 

这会奏效,但我们可以做得更好。让我们使用更通用的东西,而不是硬编码“真棒”这个词:

word='awesome'
products[word] = products['word_count'].apply(lambda x: x[word] if word in x else 0L)

现在我们有了可以插入任何单词的更通用的东西。因此,假设我们有一个需要计数的单词列表。我们可以对列表中的所有内容执行此操作。

word_list = ['awesome','and','some','other','words']
for word in word_list:
    products[word] = products['word_count'].apply(lambda x: x[word] if word in x else 0L)    

这是一个很好的通用解决方案,可用于任意数量的单词。快乐编码。

于 2015-12-14T22:08:40.050 回答
1

您必须将每一行发送到函数进行处理。所以函数需要接收一个参数然后进行处理。这就是您收到此类错误的原因。请注意,在这种情况下,您不需要函数的学徒,因为它会解析整个 SFrame 解决方案如下所示:

def awesome_count(x):
   if 'awesome' in x:
       return x['awesome']
   else
       return 0 

products['awesome'] = products['word_count'].apply(awesome_count)
于 2015-12-27T19:26:07.840 回答
0

您可以创建一个简单的函数来接受搜索文本和要搜索的关键字:

def word_count(search_text, search_word):
    word_count=search_text.split(" ").count(search_word)
    return word_count

然后使用 lambda 指定要搜索的单词:

products['ColumnWithTextToSearch'].apply(lambda x: word_count(x, 'awesome'))
于 2017-03-10T20:59:45.330 回答
0

我认为该函数已在 lambda 函数中调用。这段代码对我有用:

import graphlab
sf = graphlab.SFrame({'a': [1, 2, 3]})

def awesome_count():
    return 10

sf['a2'] = sf['a'].apply(lambda x: awesome_count())
于 2015-11-20T00:37:22.100 回答
0

我在同一个 Coursera 课程。

目标/意图:

目标是创建一个列 products['awesome'] ,其中每一行包含“awesome”一词在相应产品的评论中出现的次数,如果评论没有出现,则为 0。一种方法是查看每一行的“word_count”列并遵循以下逻辑:

如果“awesome”出现在特定产品(产品 SFrame 的行)的字数中,那么我们知道“awesome”在评论中出现的频率,如果“awesome”没有出现在字数中,那么它没有出现在评论中,我们应该在这篇评论中将“真棒”的计数设置为 0。

所需的方法:

products['awesome'] = products['word_count'].apply(awesome_count)

最后,我需要为 10 个额外的单词执行上述操作。

这对我有用,但仅适用于awesome一词。诡异的。

定义函数真棒计数:(请参阅第一周的 ipython 笔记本以创建函数和 if/then 语句)

def awesome_count(x):
    if 'awesome' in x: 
        y=dict['awesome']
    else: y=0
    return y

以上工作。如果我调用它并查看数据集的头部,变量 awesome 就在那里。

如果我这样做:

def great_count(x):
    if 'great' in x: 
        y=dict['great']
    else: y=0
    return y

然后:

products['great'] = products['word_count'].apply(great_count)

我得到:

TypeErrorTraceback (most recent call last)
<ipython-input-51-f51e1151a1bd> in <module>()
----> 1 products['great'] = products['word_count'].apply(great_count)

/opt/conda/lib/python2.7/site-packages/graphlab/data_structures/sarray.pyc in apply(self, fn, dtype, skip_undefined, seed)
   1868         assert callable(fn), "Input function must be callable."
   1869 
-> 1870         dryrun = [fn(i) for i in self.head(100) if i is not None]
   1871         if dtype == None:
   1872             dtype = infer_type_of_list(dryrun)

<ipython-input-50-54d747d1e0e1> in great_count(x)
      4 def great_count(x):
      5     if 'great' in x:
----> 6         y=dict['great']
      7     else: y=0
      8     return y

TypeError: 'type' object has no attribute '__getitem__'

顺便说一句,我在 iPhython Notebook 中运行所有这些。

于 2018-01-21T06:23:57.070 回答
0

您必须将用户定义或内置函数或方法或类对象传递给该apply方法,如果您传递awesome_count()您将返回值 ( 10) 传递给该apply方法,则必须删除括号:

def awesome_count():
    return 10
products['awesome'] = products['word_count'].apply(awesome_count)
于 2015-11-03T18:53:32.680 回答
0

你的话字典是这样的:

wordsdict = {"this":5, "is":2, "a":1, "really":4, "awesome":10, "string":12, "Awesome":20, "AWESOME":30, "yeah":1}

这就是您要问的:返回相关的计数。

def awesome_count(wordsdict):
   if 'awesome' in wordsdict:
       return wordsdict['awesome']

现在你想用一个可能是潜在列名的单词列表来概括这一点:

products = graphlab.SFrame(...)

words = ["awesome", "great", "good", "fantastic"]

for word in words:
    products[word] = products['word_count'].apply(lambda x: x[word] if word in x)
于 2015-12-29T09:36:11.773 回答