TfidfVectorizer转DataFrame时Shape不匹配报错求助
解决TF-IDF结果转DataFrame时的形状不匹配错误
错误原因
你触发的ValueError: Shape of passed values is (3900, 7098), indices imply (7098, 1),核心问题是矩阵形状不匹配:
tfidf_vectorizer_vectors.todense()生成的是[样本数 × 特征词数]的矩阵(这里是3900个训练样本×7098个特征词)。- 你构建DataFrame时,把
feature_names(7098个词)作为行索引,同时只指定1列["tfidf"],两者维度完全不兼容。
解决方案
要生成你期望的「每个token对应一个TF-IDF值」的表格,需要先对TF-IDF矩阵按特征词维度做聚合计算(比如取所有样本的平均值、求和),再构建DataFrame。
修改后的完整代码(替换原代码最后构建df的部分):
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer file_name = '../../data/spam.csv' spam_data_df = pd.read_csv(file_name) spam_data_df['target'] = np.where(spam_data_df['target']=='spam',1,0) X_train, X_test, y_train, y_test = train_test_split(spam_data_df['text'], spam_data_df['target'], test_size=0.3, random_state=0) X_train_list = X_train.tolist() tfidf_vectorizer = TfidfVectorizer() tfidf_vectorizer_fit = tfidf_vectorizer.fit(X_train_list) tfidf_vectorizer_vectors = tfidf_vectorizer.transform(X_train_list) feature_names = tfidf_vectorizer.get_feature_names_out() # 计算每个特征词在所有训练样本中的平均TF-IDF值 tfidf_avg = tfidf_vectorizer_vectors.mean(axis=0).tolist()[0] # 构建符合期望格式的DataFrame df = pd.DataFrame({ "token": feature_names, "tfidf": tfidf_avg }) # 可选:按TF-IDF值降序排序,方便查看重要性高的词 df = df.sort_values(by="tfidf", ascending=False).reset_index(drop=True) print(df.head())
代码说明
mean(axis=0):对TF-IDF矩阵的每一列(对应一个特征词)计算所有样本的平均值,得到1×7098的结果,和feature_names的长度完全匹配。- 用字典直接构建DataFrame,确保
token列对应特征词,tfidf列对应聚合后的数值,完全符合你想要的表格格式。
内容的提问来源于stack exchange,提问作者Ubaidul Khan
相关产品推荐
相关产品推荐

