如何用Pandas从含分隔标记的单个CSV读取多个DataFrame?
用Pandas分割带分隔标记的CSV为多个DataFrame
问题背景
你有如下结构的CSV文件:
col A, col B 1, 5 2,7 78,65 ########### 5,8 15,23 ########### 17, 15 25,62 12,15 95,56
需要将其转换为一组DataFrame,每个DataFrame对应###########分隔标记之间的区域,希望用Pandas实现(而非file.readlines()的方式),预期结果如下:
df1 = {'col A': {1,2,78}, 'col B': {5,7,65}} df2 = {'col A': {5,15}, 'col B': {8,23}} df3 = {'col A': {17,25,12,95}, 'col B': {15,62,15,56}}
Pandas实现方案
步骤说明
- 读取整个CSV文件,保留所有行(包括分隔符行),不预先设置表头;
- 定位所有分隔符所在的行,以此为边界划分数据组;
- 对每个数据组,设置表头、清理数据格式,转换为独立的DataFrame。
代码实现
import pandas as pd # 读取文件,不设置表头,保留所有行 full_data = pd.read_csv('your_file.csv', header=None, skip_blank_lines=False) # 定义分隔符字符串 separator = '###########' # 找出所有包含分隔符的行索引 sep_rows = full_data[full_data[0].str.contains(separator, na=False)].index.tolist() # 构造分组的边界(包含文件开头和结尾) group_bounds = [-1] + sep_rows + [len(full_data)] # 存储结果DataFrame的列表 result_dfs = [] # 获取表头(第一行数据) header = full_data.iloc[0].str.strip().tolist() for idx in range(len(group_bounds) - 1): # 计算当前组的起始和结束行 start_row = group_bounds[idx] + 1 end_row = group_bounds[idx + 1] group = full_data.iloc[start_row:end_row] # 跳过空组或重复的表头行(第一个组的起始行是0时跳过表头行) if len(group) == 0 or (idx == 0 and start_row == 0): continue # 处理数据:设置表头、去除空格、转换为数值类型、重置索引 group.columns = header cleaned_group = group.apply(lambda col: col.str.strip()) \ .dropna() \ .astype(int) \ .reset_index(drop=True) result_dfs.append(cleaned_group) # 提取结果 df1, df2, df3 = result_dfs # 验证输出 print("df1:\n", df1) print("\ndf2:\n", df2) print("\ndf3:\n", df3)
代码解释
pd.read_csv(..., header=None):避免将第一行直接设为表头,保留所有原始行数据;full_data[0].str.contains(separator):定位所有分隔符所在的行,为分组提供边界;- 循环处理每个分组时,通过
apply(lambda col: col.str.strip())清理单元格的空格,astype(int)将数据转换为数值类型,确保DataFrame的格式符合预期。
内容的提问来源于stack exchange,提问作者Galedon
相关产品推荐
相关产品推荐

