如何使用pandas apply替代嵌套循环处理pos列调用get_sentiment函数
你触发ValueError: too many values to unpack (expected 2)的核心问题是列表推导式多写了一层不必要的嵌套循环。pos列的每一行值本身就是由二元组组成的列表,例如[(No, DT), (thank, NN), (you, PRP)],你原来的写法[get_sentiment(x,y) for j in k for (x,y) in j]相当于先遍历列表拿到每个二元组j,再遍历二元组内部的单个元素,尝试把单个字符串解包成x、y两个变量,自然会报错。
写法1:简洁lambda版(符合Pandas风格)
直接遍历pos每行的二元组列表即可,如果get_sentiment本身对部分词性组合返回空列表,就会和你给出的预期输出格式完全匹配:
df['score'] = df['pos'].apply(lambda pos_list: [get_sentiment(word, tag) for word, tag in pos_list])
写法2:独立函数版(更易调试维护)
如果后续需要调整得分计算逻辑,建议把逻辑抽成单独函数:
def get_sentiment_for_pos(pos_seq): res = [] for word, pos_tag in pos_seq: res.append(get_sentiment(word, pos_tag)) return res df['score'] = df['pos'].apply(get_sentiment_for_pos)
内容的提问来源于stack exchange,提问作者sariii
相关产品推荐
相关产品推荐

