讲师中心 微信公众号
AI工具推荐 视频效率加速

Pandas DataFrame:高效利用文件名作为行索引构建文档-词矩阵

浅静大大_3998

浅静大大_3998

发布时间:2025-08-13 17:34:01

|

1085人浏览过

|

来源于php中文网

原创

Pandas DataFrame:高效利用文件名作为行索引构建文档-词矩阵

本文详细介绍了如何在Pandas DataFrame中高效地将文件名或其特定部分(如去除扩展名的文件名)设置为行索引。通过利用pd.DataFrame构造函数的index参数和pathlib模块的便捷功能,能够将文本处理中生成的文档-词矩阵(DTM)的行与原始文件关联起来,从而显著提升数据可读性和后续分析的便利性,避免使用默认的数字索引。

在进行文本分析,特别是构建文档-词矩阵(document-term matrix, dtm)时,我们通常会从多个文本文件中提取词频或tf-idf值。默认情况下,pandas dataframe会为每一行分配一个从0开始的数字索引。然而,为了更好地理解数据,将每一行与它所代表的原始文件名关联起来是至关重要的。例如,当处理按年份命名的文件(如"1905.txt")时,将年份作为行索引能极大提高数据的可读性和分析效率。

问题场景:默认索引与期望的文件名索引

假设我们已经从一系列.txt文件中读取内容,并使用sklearn.feature_extraction.text.CountVectorizer生成了一个文档-词矩阵。此时,count_array包含了词频数据,coun_vect.get_feature_names()提供了列名(即词汇)。如果直接使用pd.DataFrame(data=count_array, columns=coun_vect.get_feature_names())创建DataFrame,其行索引将是默认的数字序列,如下所示:

Hello I am
0 1 2 1
1 1 1 1
2 0 1 2

而我们期望的结果是,将原始文件名(例如"1905.txt")作为行索引,并且最好能进一步去除文件扩展名,只保留核心信息(如"1905"),使其更简洁明了:

Hello I am
1905 1 2 1
1906 1 1 1
1907 0 1 2

解决方案:利用DataFrame构造函数的index参数

Pandas DataFrame的构造函数提供了一个index参数,允许我们在创建DataFrame时直接指定行索引。这个参数接受一个与数据行数相同长度的列表或数组,其中的元素将作为每一行的标签。

1. 将完整的文件路径作为索引

在文件读取阶段,我们通常会收集所有文件的路径。如果这些路径存储在一个有序的列表中(例如corpus),并且其顺序与count_array中的行顺序一致,那么可以直接将这个列表作为index参数的值。

import pandas as pd
from pathlib import Path
from sklearn.feature_extraction.text import CountVectorizer
import re

# 假设文件存储在 'files' 目录下,请替换为您的实际路径
# 例如:'/Users/MyPath/files'
FILE_DIRECTORY = Path("./files") 

# 创建一个用于存储文件路径的列表
corpus = []

# 使用 pathlib 遍历指定目录下的所有 .txt 文件
for fichier in FILE_DIRECTORY.rglob("*.txt"):
    corpus.append(fichier) # 将 Path 对象直接添加到列表中

# 对文件路径进行排序,确保与后续处理的顺序一致
corpus.sort()

all_documents = []
for fichier_txt_path in corpus:
    with open(fichier_txt_path, 'r', encoding='utf-8') as f: # 建议指定编码
        fichier_txt_chaine = f.read()
        # 清理文本,只保留字母
        fichier_txt_chaine = re.sub('[^A-Za-z]', ' ', fichier_txt_chaine) 
    all_documents.append(fichier_txt_chaine)

# 使用 sklearn 构建文档-词矩阵
coun_vect = CountVectorizer(stop_words="english")
count_matrix = coun_vect.fit_transform(all_documents)
count_array = count_matrix.toarray()

# 方案一:将完整的 Path 对象作为索引
# pd.DataFrame(data=count_array, columns=coun_vect.get_feature_features(), index=corpus)
# 此时索引将是 Path 对象,如 PosixPath('files/1905.txt')

2. 将文件名(含扩展名)作为索引

通常,我们只关心文件名本身,而不是完整的路径。pathlib.Path对象提供了.name属性,可以直接获取文件名(包含扩展名)。

AI舌诊面诊问诊医疗系统+诊疗商城系统源码
AI舌诊面诊问诊医疗系统+诊疗商城系统源码

AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。

下载
# ... (承接上述代码) ...

# 方案二:将文件名(含扩展名)作为索引
file_names = [f.name for f in corpus]
allDataframe_with_names = pd.DataFrame(data=count_array, 
                                       columns=coun_vect.get_feature_names_out(), # 推荐使用 get_feature_names_out()
                                       index=file_names)
print("DataFrame with filenames as index:")
print(allDataframe_with_names.head())

3. 将文件名(不含扩展名)作为索引 (推荐)

在许多情况下,文件扩展名是冗余的,我们只想要文件名的主体部分。pathlib.Path对象还提供了.stem属性,可以方便地获取不包含扩展名的文件名。这对于按年份命名的文件(如"1905.txt")尤为适用,可以直接提取出"1905"。

# ... (承接上述代码) ...

# 方案三:将文件名(不含扩展名)作为索引
file_stems = [f.stem for f in corpus]
allDataframe_with_stems = pd.DataFrame(data=count_array, 
                                       columns=coun_vect.get_feature_names_out(),
                                       index=file_stems)
print("\nDataFrame with file stems as index:")
print(allDataframe_with_stems.head())

# 将结果保存到CSV文件
allDataframe_with_stems.to_csv("Matrice_doc_term_with_filenames.csv", index=True) # index=True 确保索引也被写入CSV

完整示例代码:

为了使代码可运行,我们创建一个模拟的files目录和一些.txt文件。

import pandas as pd
from pathlib import Path
from sklearn.feature_extraction.text import CountVectorizer
import re
import os

# --- 模拟文件和目录创建 (仅为示例,实际使用时请替换为您的文件路径) ---
# 创建一个临时目录
temp_dir = Path("./temp_text_files")
temp_dir.mkdir(exist_ok=True)

# 创建模拟的 .txt 文件
file_contents = {
    "1905.txt": "Hello world, this is the year 1905. A new beginning.",
    "1906.txt": "I am here in 1906. The world is changing.",
    "1907.txt": "Am I still here? Yes, it's 1907. Life goes on.",
    "1908.txt": "Another year, another story. This is 1908.",
}

for filename, content in file_contents.items():
    (temp_dir / filename).write_text(content, encoding='utf-8')
# -----------------------------------------------------------------

# 指定文件目录为模拟创建的目录
FILE_DIRECTORY = temp_dir 

# 创建一个用于存储文件路径的列表
corpus = []

# 使用 pathlib 遍历指定目录下的所有 .txt 文件
for fichier in FILE_DIRECTORY.rglob("*.txt"):
    corpus.append(fichier)

# 对文件路径进行排序,确保与后续处理的顺序一致
corpus.sort()

all_documents = []
for fichier_txt_path in corpus:
    with open(fichier_txt_path, 'r', encoding='utf-8') as f:
        fichier_txt_chaine = f.read()
        # 清理文本,只保留字母
        fichier_txt_chaine = re.sub('[^A-Za-z]', ' ', fichier_txt_chaine) 
    all_documents.append(fichier_txt_chaine)

# 使用 sklearn 构建文档-词矩阵
coun_vect = CountVectorizer(stop_words="english")
count_matrix = coun_vect.fit_transform(all_documents)
count_array = count_matrix.toarray()

# 获取特征名(词汇)
feature_names = coun_vect.get_feature_names_out()

# 方案:将文件名(不含扩展名)作为索引
file_stems = [f.stem for f in corpus]
allDataframe = pd.DataFrame(data=count_array, 
                            columns=feature_names,
                            index=file_stems)

print("Final DataFrame with file stems as index:")
print(allDataframe)

# 将结果保存到CSV文件,并确保索引也被写入
allDataframe.to_csv("Matrice_doc_term_with_filenames.csv", index=True)

# --- 清理模拟文件和目录 (仅为示例) ---
for filename in file_contents.keys():
    (temp_dir / filename).unlink() # 删除文件
temp_dir.rmdir() # 删除目录
# ------------------------------------

注意事项与总结

  1. 索引顺序的重要性: 确保传递给index参数的列表的顺序与data(即count_array)中行的顺序严格一致。在上述示例中,我们通过对corpus列表进行sort()操作来保证了这一点。
  2. pathlib的优势: pathlib模块提供了比os.path更面向对象的路径操作方式,其.name和.stem属性极大地简化了文件名和文件主体名的提取,代码更简洁易读。
  3. get_feature_names_out(): 在新版sklearn中,CountVectorizer的get_feature_names()方法已被弃用,推荐使用get_feature_names_out()。
  4. CSV保存: 当使用to_csv()方法保存DataFrame时,如果希望索引列也被保存到CSV文件中,请务必设置index=True(这是默认值,但明确指定可以增加代码可读性)。

通过以上方法,我们可以轻松地将原始文件的标识信息作为Pandas DataFrame的行索引,从而构建出更具可读性和分析价值的文档-词矩阵,为后续的数据可视化和深入分析奠定坚实基础。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

811

2026.04.13

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1158

2023.09.04

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

7395

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

362

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

384

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

263

2026.04.17

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn