如何用Python Pandas合并CSV时移除除首文件外的多行重复表头
解决Pandas合并CSV时保留首个文件表头、跳过其余文件7行表头的问题
Hey there! Let's get your CSV merging task sorted properly. Your current code has a few small issues that are preventing it from working as expected—let's fix them step by step.
问题分析
- 你在循环内部调用
pd.concat(dfs),这意味着每添加一个文件就会合并一次DataFrame,既低效又可能导致数据重复。 skiprows=[0]只跳过了后续文件的第一行,但你需要跳过整整7行表头。- 保存最终CSV时设置
header=None会把你特意保留的首个文件表头给去掉。
修正后的完整代码
import glob import pandas as pd # 获取当前目录下所有CSV文件(如果需要指定路径,替换成glob.glob("path/*.csv")) filenames = glob.glob("*.csv") print(filenames) dfs = [] for idx, filename in enumerate(filenames): if idx == 0: # 第一个文件完整读取,保留原始表头 df = pd.read_csv(filename) dfs.append(df) else: # 后续文件跳过前7行表头,直接读取数据行 # 如果你的CSV用分号分隔,记得加上sep=";",比如pd.read_csv(filename, sep=";", skiprows=7) df = pd.read_csv(filename, skiprows=7) dfs.append(df) # 一次性合并所有DataFrame,重置索引避免混乱 full_df = pd.concat(dfs, ignore_index=True) # 保存合并后的文件,保留表头(默认header=True,无需额外设置) full_df.to_csv("combined_csv.csv", index=False, encoding='utf-8-sig')
关键细节说明
- 用
enumerate(filenames)跟踪文件索引,比手动维护count_files变量更简洁直观。 - 第一个文件正常读取,完整保留其表头结构。
- 后续文件通过
skiprows=7告诉Pandas跳过前7行表头,直接从第8行的数据行开始读取。 - 把
pd.concat(dfs)移到循环外,只执行一次合并,对6-10个文件来说效率提升明显。 ignore_index=True重置合并后的DataFrame索引,避免原文件的索引重复混乱。- 保存时不设置
header=None,这样就能保留首个文件的表头,完全符合你的需求。
额外注意事项
- 如果你的CSV文件用逗号以外的分隔符(比如你之前尝试的
sep=";"),记得在两个read_csv调用里都加上这个参数,避免解析错误。 - 确认非首个文件确实是7行表头,跳多或跳少都会导致数据和表头错位。
- 如果需要按特定顺序合并文件,可以先对
filenames排序,比如filenames = sorted(glob.glob("*.csv"))。
内容的提问来源于stack exchange,提问作者Harini
相关产品推荐
相关产品推荐

