我有一个短代码如下。尝试使用.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.
有人可以帮帮我吗?
答案 0 :(得分:13)
我认为有几件事可以帮助你解决这个问题。第一个是将“awesome_count”函数转换为lambda函数。假设awesome_count的目标是返回单词“awesome”出现的次数,我知道产品['word_count']包含单词和计数字典(即“and”=>&gt; 5,“awesome” =&gt; 2,“糟糕=”1“)。这里的辛苦工作已经为你完成了,因为你拥有产品中的所有计数['word_count']。唯一需要注意的是你这个词'重新寻找可能不存在于列表中。
def awesome_count():
if 'awesome' in products['word_count']:
return products['word_count']['awesome']
else
return 0L
这里的函数检查单词列表中是否有“awesome”。如果是,那么我们只返回产品['word_count'] ['awesome'](即真棒发生的次数)。如果'awesome'不存在,那么我们默认为0.
所以让我们把它变成一个lambda。基于他的路线:
products['awesome'] = products['word_count'].apply(awesome_count())
每次调用lambda函数都会传入产品['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)
这会奏效,但我们可以做得更好。而不是硬编码'awesome'这个词,让我们使用更通用的东西:
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)
这是一个很好的通用解决方案,可用于任意数量的单词。快乐的编码。
答案 1 :(得分:1)
您必须将每行发送到函数进行处理。所以函数需要接收一个参数然后进行处理。这就是你收到这样一个错误的原因。请注意,在这种情况下,您不需要函数的prentices,因为它解析整个SFrame 解决方案是这样的:
def awesome_count(x):
if 'awesome' in x:
return x['awesome']
else
return 0
products['awesome'] = products['word_count'].apply(awesome_count)
答案 2 :(得分:0)
您必须将user-defined or built-in function or method, or a class object传递给apply
方法,如果您通过awesome_count()
,则会将返回值(10
)传递给apply
方法,您必须删除括号:
def awesome_count():
return 10
products['awesome'] = products['word_count'].apply(awesome_count)
答案 3 :(得分: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())
答案 4 :(得分:0)
你的单词dictonary是这样的:
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)
答案 5 :(得分: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'))
答案 6 :(得分:0)
我在同一课程中。
目标/意图:
目标是创建一个列产品['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
以上作品。如果我调用它并查看数据集的头部,那么变量很棒。
如果我这样做:
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中运行了所有这些。