如何在Python中利用另一DataFrame生成的高频词计算目标列
解决高频词对应商品Days_Sold总和计算问题
问题概述
你手里有一份记录商品描述和销售天数的DataFrame,已经通过collections.Counter统计出描述列里的高频词并存在count DataFrame中,现在需要自动计算每个高频词对应的所有含该词商品的Days_Sold总和,还要能支持处理3000+行数据、40+个高频词的场景,没法手动逐个处理。
简洁高效的解决方案
这里给你一套更直接的实现逻辑,避开复杂嵌套循环,完美适配你的需求:
import pandas as pd from collections import Counter import numpy as np # 初始化原始DataFrame cup = {'Description': ['strawberry cupcake', 'blueberry cupcake', 'strawberry cookie', 'grape organic cookie', 'blueberry organic cookie', 'lemon organic cupcake'], 'Days_Sold': [3, 4, 1, 2, 2, 1]} cake = pd.DataFrame(data=cup) # 自定义高频词数量:通过most_common(n)里的n值调整,比如取前40个就写40 word_counts = Counter(" ".join(cake['Description']).split()).most_common(40) count = pd.DataFrame(word_counts, columns=['Words', 'Values']) count.index = np.arange(1, len(count)+1) # 核心计算:给每个高频词匹配对应商品的Days_Sold总和 result = count.copy() result['Total_Days_Sold'] = result['Words'].apply( lambda word: cake[cake['Description'].str.contains(word, case=False)]['Days_Sold'].sum() ) # 查看最终结果 print(result)
代码细节说明
- 自定义高频词数量:在
Counter(...).most_common(n)里修改n的值,就能精准获取你需要的前n个高频词,轻松应对40+的需求。 - 匹配逻辑:用
str.contains()检查商品描述是否包含目标高频词,case=False保证大小写不干扰匹配(不需要的话可以去掉),再对匹配到的行的Days_Sold求和。 - 效率适配:利用Pandas的矢量化操作替代嵌套循环,处理3000+行数据时速度更快,也更易维护。
你之前代码的问题分析
你尝试的嵌套循环报'int' object is not iterable错误,主要问题出在:
for day in cake遍历的是DataFrame的列名(也就是Description和Days_Sold),不是行数据,后续赋值操作把循环变量搞混了。for top in count同样是遍历列名,top= count.Words这行根本没正确获取每个高频词,反而覆盖了循环变量,导致后续匹配逻辑完全错位。
关于你更新方案的优化建议
你后来调整的方案也能实现需求,但可以再简化:拆分描述列后合并的逻辑,其实用上面的apply+str.contains方式更直接,代码量更少,执行效率也更高。
内容的提问来源于stack exchange,提问作者Kitty.Cattie
相关产品推荐
相关产品推荐

