call函数在python中使用.apply

ali*_*ice 3 python sframe

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

def awesome_count():
    return 10
products['awesome'] = products['word_count'].apply(awesome_count())
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?

小智 13

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

def awesome_count():
   if 'awesome' in products['word_count']:
       return products['word_count']['awesome']
   else
       return 0L
Run Code Online (Sandbox Code Playgroud)

这里的函数检查单词列表中是否有"awesome".如果是,那么我们只返回产品['word_count'] ['awesome'](即真棒发生的次数).如果'awesome'不存在,那么我们默认为0.

所以让我们把它变成一个lambda.基于他的路线:

products['awesome'] = products['word_count'].apply(awesome_count())
Run Code Online (Sandbox Code Playgroud)

每次调用lambda函数都会传入产品['word_count'].在我们的lambda函数中,这将是x.

lambda x: x['awesome'] if 'awesome' in x else 0L
Run Code Online (Sandbox Code Playgroud)

这与上面相同,但是采用lambda格式.所以将它结合起来:

products['awesome'] = products['word_count'].apply(lambda x: x['awesome'] if 'awesome' in x else 0L) 
Run Code Online (Sandbox Code Playgroud)

这会奏效,但我们可以做得更好.而不是硬编码'awesome'这个词,让我们使用更通用的东西:

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

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

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)    
Run Code Online (Sandbox Code Playgroud)

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