You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中DataFrame分词后统计词频遇TypeError错误的解决方法

问题描述

对DataFrame的category列分词后,执行Counter(tokens)时触发错误:

TypeError: unhashable type: 'list'

执行的代码如下:

ue_df_c['category'] = ue_df_c['category'].astype(str)
# apply the `word_tokenize()` function
tokens = ue_df_c['category'].apply(word_tokenize)

print(tokens)输出示例:

0                    [Burgers, ,, American, ,, Sandwiches]
1        [Coffee, and, Tea, ,, Breakfast, and, Brunch, ...
2        [American, ,, Cheesesteak, ,, Sandwiches, ,, A...
3                                                  [Pizza]
4        [Breakfast, and, Brunch, ,, Burgers, ,, Sandwi...
                               ...                        
45222    [Mexican, ,, Latin, American, ,, New, Mexican,...
45223      [Mexican, ,, Latin, American, ,, Family, Meals]
45224    [Mediterranean, ,, Greek, ,, Family, Meals, ,,...
45225                         [Thai, ,, Asian, ,, Noodles]
45226    [Breakfast, and, Brunch, ,, American, ,, Sandw...
Name: category, Length: 45227, dtype: object
解决方案

1. 核心问题原因

tokens是由列表组成的Series,而Counter仅能接收可哈希元素(如字符串、数字),列表属于不可哈希类型,因此触发报错。需先将所有子列表中的token合并为一维可迭代对象。

2. 修复代码并统计词频

方式1:合并所有token并统计

from collections import Counter
import itertools

# 合并所有子列表中的token
all_tokens = itertools.chain.from_iterable(tokens)
# 也可用列表推导式实现:all_tokens = [t for sublist in tokens for t in sublist]

# 统计每个token的频率
token_counts = Counter(all_tokens)

方式2:过滤无效token(可选)

从输出可见,分词结果包含逗号(,,)这类无意义符号,可先过滤再统计:

# 只保留由字母组成的token
filtered_tokens = [t for sublist in tokens for t in sublist if t.isalpha()]
token_counts = Counter(filtered_tokens)

3. 可视化词频

以Matplotlib和Seaborn为例,绘制高频词条形图:

import matplotlib.pyplot as plt
import seaborn as sns

# 取频率最高的10个token
top_10_tokens = token_counts.most_common(10)
words, counts = zip(*top_10_tokens)

# 绘制水平条形图
plt.figure(figsize=(12, 6))
sns.barplot(x=list(counts), y=list(words), palette='viridis')
plt.title('Top 10 Most Frequent Category Tokens')
plt.xlabel('Frequency')
plt.ylabel('Token')
plt.tight_layout()
plt.show()

补充:若需求是统计原始类别组合的频率

如果你的实际需求是统计完整的category值(而非分词后的单个词),无需分词,直接用Pandas内置方法:

# 统计原始类别频率
category_counts = ue_df_c['category'].value_counts()

# 可视化前10个高频类别
plt.figure(figsize=(12, 6))
category_counts.head(10).plot(kind='barh', color='skyblue')
plt.title('Top 10 Most Frequent Categories')
plt.xlabel('Count')
plt.ylabel('Category')
plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者Devkenyalang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:36:21