如何使用pandas将包含多个表格的单个CSV合并为统一DataFrame
多表格CSV合并的Pandas简洁实现方案
完全可以通过pandas内置方法简化实现,无需复杂的自定义文件读取循环,核心逻辑是先给每行打所属表格的分组标记,再批量处理每个分组即可。
实现思路
- 按行读取整个CSV为单列DataFrame,自动跳过空行
- 识别所有marker开头的行,通过累加标记给每一行分配所属表格的分组ID
- 按分组ID拆分出每个独立表格的内容块
- 对每个块依次提取信息字段、表头、表数据,新增info1、info2列后存入列表
- 直接concat所有子表,pandas会自动对齐不同表的列,缺失值填充NaN
代码实现
import pandas as pd # 1. 按行读取全量数据,自动跳过空行 df_raw = pd.read_csv("test.csv", sep="\n", header=None, skip_blank_lines=True) # 2. 生成表格分组ID:遇到marker行分组ID+1 df_raw["group_id"] = df_raw[0].str.startswith("marker").cumsum() sub_dfs = [] for _, group in df_raw.groupby("group_id"): # 按多分隔符拆分所有行内容 rows = group[0].str.split(r";|,|\*", expand=False).tolist() # 提取2个信息字段(marker行下第一行的前2个值) info1, info2 = rows[1][0].strip(), rows[1][1].strip() # 提取列头(marker行下第二行) table_cols = [col.strip() for col in rows[2]] # 提取表数据(列头行之后的所有内容) table_data = rows[3:] # 生成子表并添加信息字段 tmp_df = pd.DataFrame(table_data, columns=table_cols) tmp_df["info1"], tmp_df["info2"] = info1, info2 sub_dfs.append(tmp_df) # 合并所有子表,自动对齐列 final_df = pd.concat(sub_dfs, ignore_index=True) # 输出结果 final_df.to_csv("merged_output.csv", index=False)
优化点说明
- 去掉了手动操作文件指针逐行读取的逻辑,避免指针越界、行数计算错误等问题
- 无需提前计算每个表格的长度,groupby自动完成表格拆分
- 代码量相比原版本减少约60%,逻辑清晰易维护,调整规则仅需修改对应行索引即可
- 自动处理字段前后的空格,避免列名、info字段带多余空格的问题
内容的提问来源于stack exchange,提问作者skleijn
相关产品推荐
相关产品推荐

