如何将Pandas apply中Sastrawi词干提取Lambda改写为普通函数并修复报错
问题原因
你改写后的函数存在2个核心逻辑错误,和df['tweets_stopwords']的格式本身无关:
- 你混淆了
apply()传入函数的参数:df['列名'].apply(函数)会把该列的每个单元格值逐个传入函数,而不是把整个列传入。你在函数内部错误遍历了整个df['tweets_stopwords']列,导致每次传入的单个单元格列表(你定义的参数stemming)被当做整体传入stemmer.stem()方法,而该方法要求接收字符串,所以抛出类型错误。 - 你在每次调用函数时都重复创建Stemmer实例,会严重拖慢运行效率,完全没必要。
修复后代码
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory # 全局创建一次stemmer即可,不需要重复初始化 factory = StemmerFactory() stemmer = factory.create_stemmer() def stemmer_remover(word_list): # 传入的word_list就是单个单元格的分词列表,直接遍历它就行 return [stemmer.stem(word) for word in word_list] df['tweets_stemming'] = df['tweets_stopwords'].apply(stemmer_remover)
可选兼容逻辑
如果你的df['tweets_stopwords']列存在空值或者非列表格式的脏数据,可以加一层判断避免报错:
def stemmer_remover(word_list): if not isinstance(word_list, list): return [] return [stemmer.stem(word) for word in word_list if isinstance(word, str)]
内容的提问来源于stack exchange,提问作者caeruleum
相关产品推荐
相关产品推荐

