如何将一个函数(BigramCollocationFinder)应用于Pandas DataFrame?

4
我不太擅长编程,需要帮助解决一个问题。我有一个包含4列和大约5k行的.csv文件,填充了问题和答案。我想在每个单元格中找到词组搭配。
起点:带有4列和大约5k行的Pandas数据帧(Id,Title,Body,Body2)。
目标:带有7列(Id,Title,Title-Collocations,Body,Body_Collocations,Body2,Body2-Collocations)的数据帧,并对其每行应用一个函数。
我在NLTK文档中找到了Bigramm Collocation的示例。
bigram_measures = nltk.collocations.BigramAssocMeasures()
finder.apply_freq_filter(3)
finder = BigramCollocationFinder.from_words(nltk.corpus.genesis.words('english-web.txt'))
print (finder.nbest(bigram_measures.pmi, 5))
>>>[('Beer', 'Lahai'), ('Lahai', 'Roi'), ('gray', 'hairs'), ('Most', 'High'), ('ewe', 'lambs')]

我希望能将这个函数适用于我的 Pandas 数据框架。我知道 Pandas 数据框架中的 apply 函数,但是无法使其正常工作。
以下是我对其中一个列进行测试的尝试:
df['Body-Collocation'] = df.apply(lambda df: BigramCollocationFinder.from_words(df['Body']),axis=1)

但是如果我打印出一个示例行,我会得到:
print (df['Body-Collocation'][1])
>>> <nltk.collocations.BigramCollocationFinder object at 0x113c47ef0>

我甚至不确定这是否是正确的方式。能否有人指导我正确的方向?


您可以打印lambda函数的变量以查看它是否符合函数的正确格式。也许您需要执行类似于“x.values”的操作。 - Moritz
1
你能添加最小、完整、可验证的示例吗? - jezrael
我会记住下次编辑这个,谢谢大家。 - slm
2个回答

3
如果您想将BigramCollocationFinder.from_words()应用于Body列中的每个value,则需要执行以下操作:
df['Body-Collocation'] = df.Body.apply(lambda x: BigramCollocationFinder.from_words(x))

apply实际上允许您遍历所有rows,并提供相应的Bodycolumn的值给被应用的函数。

但是,如评论所建议的那样,提供数据示例将更容易解决您特定的情况。


3

谢谢您的回答。我想我的问题没有表达得很完美,但是您的回答还是帮助我找到了解决方案。有时候休息一下也是好的 :-)

如果有人对答案感兴趣,这个方法适合我。

df['Body-Collocation'] = df.apply(lambda df: BigramCollocationFinder.from_words(df['Question-Tok']),axis=1)
df['Body-Collocation'] = df['Body-Collocation'].apply(lambda df: df.nbest(bigram_measures.pmi, 3))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接