在使用Pandas处理数据时,经常会遇到需要给DataFrame添加文件名列的需求,比如批量读取多个CSV文件后,需要记录每一行数据来自哪个原始文件,方便后续做数据溯源或者按文件维度做统计分析。

单文件场景添加文件名列
如果是单个文件生成的DataFrame,添加文件名列的操作非常简单,只需要在读取数据后,新增一个列,把文件名赋值给该列的所有行即可。下面是具体的实现代码:
import pandas as pd # 读取单个CSV文件 file_name = "data_2023.csv" df = pd.read_csv(file_name) # 添加文件名列,所有行的值都是当前文件名 df["file_name"] = file_name # 查看结果 print(df.head())
上面的代码中,先定义了文件名变量,读取文件生成DataFrame后,直接给DataFrame新增file_name列,赋值为文件名,这样所有行的该列都会填充对应的文件名信息。
多文件批量添加文件名列
实际工作中更多场景是批量读取多个文件,这时候可以结合循环或者列表推导式,给每个文件对应的DataFrame添加文件名列,再合并成总的数据集。下面是批量处理CSV文件的示例:
import pandas as pd
import os
# 定义文件所在目录
file_dir = "./data_files"
# 获取目录下所有CSV文件
file_list = [f for f in os.listdir(file_dir) if f.endswith(".csv")]
# 存储所有DataFrame的列表
df_list = []
for file in file_list:
# 拼接完整文件路径
file_path = os.path.join(file_dir, file)
# 读取当前文件生成DataFrame
temp_df = pd.read_csv(file_path)
# 给当前DataFrame添加文件名列
temp_df["file_name"] = file
# 把处理后的DataFrame加入列表
df_list.append(temp_df)
# 合并所有DataFrame
total_df = pd.concat(df_list, ignore_index=True)
# 查看合并后的结果
print(total_df["file_name"].unique())
上面的代码先获取指定目录下所有的CSV文件,然后遍历每个文件,读取后给对应的DataFrame添加文件名列,最后把所有DataFrame合并成一个总表,这样总表中每一行都能对应到原始的文件名。
注意事项
- 添加文件名列的时候,要注意文件名是存储完整路径还是仅存储文件名,根据实际需求选择即可,上面的示例中存储的是仅文件名,如果需要完整路径可以把赋值的内容换成
file_path。 - 如果读取的文件不是CSV格式,比如是Excel、JSON等,只需要把
pd.read_csv换成对应的读取方法,添加文件名列的逻辑不变。 - 合并多个DataFrame的时候,建议使用
ignore_index=True参数,重置合并后的索引,避免出现索引重复的问题。
总结
给DataFrame添加文件名列的核心逻辑就是先生成DataFrame,再新增列并赋值文件名,单文件场景直接操作即可,多文件场景结合循环批量处理就能高效完成。这个方法在数据处理、数据溯源等场景中非常实用,掌握后可以提升批量数据处理的效率。