Pandas统计DataFrame消息列中idf权重>0的单词数量
问题背景
现有两个pandas DataFrame:
- 名为
idf的权重表,存储特征词对应的idf权重,数据如下:
feature_name idf_weights 2488 kralendijk 11.221923 3059 night 0 1383 ebebf 0
- 名为
df的消息表,存储文本消息及每条消息的总词数,数据如下:
message Number of Words in each message 0 night kralendijk ebebf 3
需求为df新增一列,统计每条message中对应idf权重值大于0的单词数量,预期输出如下:
message Number of Words in each message Number of words with idf_score>0 0 night kralendijk ebebf 3 1
原有代码问题
原有实现代码如下,运行后统计结果为总词数,不符合预期:
words_weights = dict(idf[['feature_name', 'idf_weights']].values) df['> zero'] = df['message'].apply(lambda x: count([words_weights.get(word, 11.221923) for word in x.split()]))
错误原因:
- 代码中直接用
count统计拆分后所有单词的数量,没有添加「权重大于0」的筛选条件 - 列表推导式仅生成了所有单词对应的权重值,没有做阈值判断,因此计数结果等于总词数
正确实现方案
修正逻辑:拆分消息为单词列表后,逐个匹配对应idf权重,仅统计权重值大于0的单词个数,代码如下:
# 构建特征词到idf权重的映射字典 words_weights = dict(zip(idf['feature_name'], idf['idf_weights'])) # 统计idf权重>0的单词数量,若单词不在权重表中默认权重为0(可根据业务需求调整默认值) df['Number of words with idf_score>0'] = df['message'].apply( lambda x: sum(1 for word in x.split() if words_weights.get(word, 0) > 0) )
运行上述代码即可得到预期输出结果。
内容的提问来源于stack exchange,提问作者Divyank
相关产品推荐
相关产品推荐

