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
相关产品推荐
相关产品推荐

