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

将pandas DataFrame的列表列传入sklearn的TfidfVectorizer结果异常如何解决

问题分析与解决

异常结果产生原因

  • 输入对象不符合接口要求:TfidfVectorizer.fit_transform()默认接收一维字符串可迭代对象作为语料输入,你直接传入完整DataFramea时,接口不会自动读取'y'列的术语内容,而是将DataFrame的列名/整体结构作为极少量的文本输入处理,最终仅生成1个有效特征,对应你看到的[[1.]]输出。
  • 数据结构与默认处理逻辑不匹配:'y'列的内容是两层嵌套列表,且你已经通过术语重复次数标注了出现频次,但TfidfVectorizer默认会对输入字符串执行空格分词、特殊字符过滤等预处理逻辑,既无法识别嵌套列表结构,也不会直接复用你标注好的频次信息。

正确实现方案

你只需要先把'y'列的嵌套列表展开、拼接为空格分隔的字符串,即可直接匹配TfidfVectorizer的处理逻辑,重复的术语会被自动统计为对应词频,无需额外调整词频计算逻辑。

完整代码示例

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

# 原始DataFrame
a = pd.DataFrame({
    'x': {0: 'John', 1: 'Ron', 2: 'Don'}, 
    'y': {
        0: [['Apple','Apple','Apple'],['Ball','Ball'],['Cat']], 
        1: [['Zebra','Zebra'],['Fox','Fox']], 
        2: [['Elf'],['Ball','Ball']]
    }
})

# 展开嵌套列表为空格分隔的术语字符串
def process_terms(nested_terms):
    flat_terms = [term for sublist in nested_terms for term in sublist]
    return " ".join(flat_terms)

# 生成符合要求的语料列表
corpus = a['y'].apply(process_terms).tolist()

# 执行TF-IDF转换
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(corpus)

结果验证

# 输出所有特征词
print(tfidf.get_feature_names_out())
# 输出转换后的TF-IDF矩阵
print(tfidf_matrix.toarray())

输出将包含Apple、Ball、Cat、Elf、Fox、Zebra共6个特征,对应3条文档的TF-IDF数值,符合预期需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:36:03