如何用Python将首列相同、无表头的多CSV合并为Pandas DataFrame
如何在Python中合并无表头、文件名代表数据含义且首列为公共列的CSV文件
嘿,这个场景我之前处理过,刚好可以给你一套靠谱的解决方案。先明确你的核心需求:所有CSV都没有表头,文件名对应各自数据的含义,而且第一列是所有文件的公共关联列对吧?用Pandas来做这个合并是最顺手的,下面一步步给你讲清楚:
核心思路拆解
- 遍历目标目录下的所有CSV文件
- 读取时指定
header=None,避免把数据行误当成表头 - 利用文件名给非公共列做标识,避免合并后列名冲突
- 以第一列(公共列)为键,逐个合并所有数据集
完整优化代码
import os import pandas as pd import glob # 替换成你的CSV文件所在路径,Windows下用\\或者/,建议用原始字符串r""避免转义问题 path = r"....\data" os.chdir(path) # 初始化合并结果容器 combined_df = None # 遍历目录下所有CSV文件 for csv_file in glob.glob("*.csv"): # 读取无表头CSV,header=None告诉Pandas不要将第一行作为表头 df = pd.read_csv(csv_file, header=None) # 提取文件名(去掉.csv后缀),用来标识这部分数据的含义 data_label = os.path.splitext(csv_file)[0] # 给列重命名:第一列保留公共列标识(默认列名0),其他列加上文件名前缀 # 这样合并后能清楚区分每列来自哪个原始文件 df.columns = [0] + [f"{data_label}_{col_idx}" for col_idx in df.columns[1:]] if combined_df is None: # 第一个文件直接作为合并的初始数据集 combined_df = df else: # 以第一列(公共列)为键合并,默认是内连接(只保留所有文件都有的公共列值) # 如果需要保留所有出现过的公共列值,把how改成'outer'即可 combined_df = combined_df.merge(df, on=0, how='inner') # 保存合并后的CSV,index=False不保存行索引,header=None不输出表头 combined_df.to_csv('Combined.csv', index=False, header=None)
关键细节说明
- 列名重命名:如果不重命名,多个CSV的非公共列都会用默认的1、2、3...作为列名,合并时会出现列名冲突,加上文件名前缀后能清晰区分每列的来源。
- 合并方式选择:
how='inner'会只保留在所有CSV中都存在的公共列值;如果需要保留所有出现过的公共列数据(哪怕某些文件里没有对应行),换成how='outer'即可。 - 初始容器优化:把初始的空DataFrame改成
None,避免第一次合并时因为空数据集导致的异常,比原代码的写法更稳健。
注意事项
- 确保所有CSV的第一列数据格式一致(比如都是字符串或数字),否则可能出现匹配失败的情况。
- 如果路径包含特殊字符,记得用原始字符串(在路径前加
r),避免转义字符引发错误。 - 如果处理的CSV文件数量极多或文件很大,内存不足的话,可以考虑用Dask这类支持并行/分块处理的库,不过一般中小规模的数据集用Pandas完全足够。
内容的提问来源于stack exchange,提问作者Nirav Prajapati
相关产品推荐
相关产品推荐

