在python中调用函数use.apply

在python中调用函数use.apply,python,sframe,Python,Sframe,我有一个短代码如下。尝试使用.apply调用函数。但它总是给我一个错误,说函数不可调用 def awesome_count(): return 10 products['awesome'] = products['word_count'].apply(awesome_count()) AssertionError回溯(最近一次调用) 在() ---->1产品['awesome']=产品['word\u count']。应用(awesome\u count()) C:\Users\tw

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

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

AssertionError回溯(最近一次调用)
在()
---->1产品['awesome']=产品['word\u count']。应用(awesome\u count())
C:\Users\twu\AppData\Local\Dato\Dato Launcher\lib\site packages\graphlab\data\u structures\sarray.pyc in apply(self、fn、dtype、skip\u undefined、seed)
1598         [0.0, 1.0, 2.0]
1599         """
->1600断言可调用(fn),“输入函数必须可调用。”
1601
1602 dryrun=[fn(i)表示自身中的i.head(100),如果i不是None]
AssertionError:输入函数必须是可调用的。
有人能帮我吗?

你必须将a传递给
apply
方法,如果你传递
awesome\u count()
你将把返回值(
10
)传递给
apply
方法,你必须去掉括号:

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

我认为该函数已在lambda函数中调用。此代码适用于我:

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

def awesome_count():
    return 10

sf['a2'] = sf['a'].apply(lambda x: awesome_count())

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

def awesome_count():
   if 'awesome' in products['word_count']:
       return products['word_count']['awesome']
   else
       return 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)    
这里的函数检查单词列表中是否有“awesome”。如果是,那么我们只返回产品['word_count']['awesome'](即出现awesome的次数)。如果“awesome”不存在,则默认为0

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

products['awesome'] = products['word_count'].apply(awesome_count())
对lambda函数的每次调用都传递产品['word\u 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)
现在我们有了一些更为通用的东西,可以插入任何单词。假设我们有一个需要统计的单词列表。我们可以为列表中的所有内容执行此操作

def awesome_count():
   if 'awesome' in products['word_count']:
       return products['word_count']['awesome']
   else
       return 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)    

这是一个很好的通用解决方案,可以用于在任意数量的单词上进行搜索。快乐编码

您必须将每一行发送给函数进行处理。因此,函数需要接收一个参数,然后进行处理。这就是为什么你会收到这样的错误。注意,在本例中,函数解析整个SFrame时,不需要该函数的前缀 解决方案如下:

wordsdict = {"this":5, "is":2, "a":1, "really":4, "awesome":10, "string":12, "Awesome":20, "AWESOME":30, "yeah":1}
def_计数(x):
如果x中的“awesome”:
返回x['awesome']
其他的
返回0
产品['awesome']=产品['word\u count']。应用(awesome\u count)

你的单词是这样的:

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)

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

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'))

我在同一个班级

目标/意图:

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

如果某个特定产品的词数中出现了“awesome”(产品SFrame的行),那么我们知道“awesome”出现在评论中的频率,如果“awesome”没有出现在词数中,那么它就没有出现在评论中,我们应该在此评论中将“awesome”的计数设置为0

所需方法:

产品['awesome']=产品['word\u count']。应用(awesome\u count)

最后,我需要再做10个单词

这对我有用,但只适用于单词awesome。奇怪

定义函数计数: (有关创建函数和if/then语句,请参阅第一周ipython笔记本)

以上工作。如果我调用它并查看数据集的头部,变量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__'
TypeErrorTraceback(最近一次调用上次)
在()
---->1产品['great']=产品['word\u count']。应用(great\u count)
/opt/conda/lib/python2.7/site-packages/graphlab/data_structures/sarray.pyc in apply(self、fn、dtype、skip_undefined、seed)
1868断言可调用(fn),“输入函数必须可调用。”
1869
->1870 dryrun=[fn(i)表示自我中的i.head(100),如果i不是无]
1871如果dtype==无:
1872数据类型=推断列表的类型(干运行)
大计数(x)
4 def大_计数(x):
5如果x中的“很棒”:
---->6 y=dict['great']
7其他:y=0
8返回y
TypeError:“type”对象没有属性“\uuuu getitem\uuuu”

顺便说一下,我在iPhython笔记本上运行所有这些

引用是什么意思?通过执行
awesome\u count()
您实际上正在调用函数,并且
apply
将收到函数的返回值,请删除括号。当我删除括号时,它仍然会给我TypeError:awesome\u count()不带参数(给定1个)是否仍有错误?@alice传递给应用的函数必须有一个参数,列中每行中的值将作为参数传递给指定应用的函数。我使用了第一个def函数,但结果是“不可调用”