Pandas DataFrame中Token列指定词出现次数统计与问题排查
代码错误定位
- 核心传参逻辑错位:原代码中
df.apply(lambda row: counter(['Token']), axis=1)传入counter函数的是手动构造的、仅包含字符串'Token'的列表,完全没有读取当前行Token列存储的真实词语列表,相当于函数只遍历了'Token'这个字符串本身,自然永远匹配不到预设的目标词,最终所有统计结果为0。 - 冗余逻辑:原
counter函数中使用enumerate取索引的写法没有实际作用,统计目标词出现次数不需要保留元素索引值,逻辑冗余。
修正后的基础实现
优先采用对单列做apply的方式,无需遍历整行数据,性能更优,逻辑更直观:
# 预先将目标词转为集合,成员判断复杂度为O(1),比列表匹配效率更高 target_words = {"uno", "dos"} # 逐行遍历Token列的列表内容,统计匹配数量 df["match_count"] = df["Token"].apply(lambda tokens: sum(token in target_words for token in tokens))
上述代码的逻辑为:遍历每行Token列表中的每个元素,判断是否属于目标词集合,利用布尔值在Python中可直接累加的特性(True等价于1,False等价于0),直接得到每行的累计匹配次数,和预期输出格式一致。
大数据量下的高性能替代方案
当数据量达到10万行以上时,逐行Python层apply的执行效率会明显偏低,可以使用Pandas底层优化的向量化逻辑实现,速度通常能提升数倍到数十倍:
target_words = {"uno", "dos"} # 1. 炸开Token列的列表结构,保留原DataFrame的索引 exploded_tokens = df["Token"].explode() # 2. 过滤出属于目标词的元素,按原索引分组统计出现次数 match_counts = exploded_tokens[exploded_tokens.isin(target_words)].groupby(level=0).size() # 3. 对齐原DataFrame的索引,没有匹配结果的行默认填充为0 df["match_count"] = match_counts.reindex(df.index, fill_value=0)
常见坑位提醒:如果你的Token列是从CSV、TXT等文本源文件读取的,实际存储的是字符串形式的伪列表(比如内容是
"['uno', 'dos']"这类文本,而非真正的Python列表对象),需要先做类型转换,否则所有统计逻辑都会失效,转换方式参考:import ast df["Token"] = df["Token"].apply(ast.literal_eval)
内容的提问来源于stack exchange,提问作者Scrambie
相关产品推荐
相关产品推荐

