如何为Pandas DataFrame逐行调用AFINN.score生成评分列?
问题:为DataFrame逐行计算AFINN情感评分
我有一个包含columns = ["UID", ... "reviewText"]列的DataFrame,想要添加一列,使用afinn包中的afinn.score函数分析reviewText列内容的AFINN评分。
最初尝试的代码如下:
import numpy as np import pandas as pd from afinn import Afinn afn = Afinn() df_analysis = pd.read_csv(data) df_analysis["AFINN"] = afn.score(str(df_analysis["reviewText"]))
afn.score函数传入单个字符串时运行正常,但生成的DataFrame中AFINN列全为0,请问我哪里操作有误?
编辑:我意识到直接转成字符串的方式不正确,于是尝试了以下代码:
df_analysis["AFINN"] = afn.score(df_analysis["actualText"].to_string())
但这样得到的是所有评论的综合AFINN评分。请问有没有办法逐行读取列值并转成字符串传入afn.score函数,返回对应行的评分值?
解决方法
错误原因
- 第一次尝试里,
str(df_analysis["reviewText"])是把整个reviewText列的Series对象转换成了类似<Series [数据...]>的字符串格式,并不是把每行的文本单独传入afn.score,afinn无法识别这种格式里的有效情感词,所以结果全为0。 - 第二次用
to_string()是把整个列的所有文本合并成了一个超大字符串,计算的自然是所有评论的总评分,而非每行单独的评分。
正确实现
用Pandas的apply方法,对reviewText列的每一行文本单独调用afn.score函数:
import numpy as np import pandas as pd from afinn import Afinn afn = Afinn() df_analysis = pd.read_csv(data) # 逐行应用afn.score函数,转字符串避免空值/非字符串类型报错 df_analysis["AFINN"] = df_analysis["reviewText"].apply(lambda x: afn.score(str(x)))
如果你的目标列是actualText(和编辑里的代码对应),把reviewText替换成actualText即可。
apply会遍历列中的每个元素,把每个元素传入lambda函数的x,转成字符串后调用afn.score计算单条评论的情感评分,最终生成对应每行的AFINN评分列。
内容的提问来源于stack exchange,提问作者Jason Oesch
相关产品推荐
相关产品推荐

