如何用Pandas从同一文件读取两个独立CSV为不同DataFrame
纯Pandas实现拆分含多区块的CSV文件
问题场景
我有一个CSV文件,里面包含两个独立的CSV数据区块,以特定标题行分隔:
Polymerase Stats部分占1-8行CCS Stats部分行数不超过50行
目前我通过枚举文件行查找CCS Stats的行号来拆分读取,方法可行,但希望完全用Pandas实现操作。
简化CSV示例
RUNID: TEST_RUN Polymerase Stats: Cell,Project,Name,Bases,Reads A01,Proj1,Cell_1,17438371,2836501 B01,Proj1,Cell_2,19327981,3789533 C01,Proj2,Cell_3,14935525,1897239 CCS Stats: Cell,Project,Name,CCS_Bases,CCS_Reads,MedQ A01,Proj1,Sample_1,5473982,123678,31 B01,Proj1,Sample_2,5834094,738491,32 B01,Proj1,Sample_3,5834094,738491,31 C01,Proj2,Sample_4,4378978,453216,31
现有解决方案(依赖文件枚举)
with open("run_stats.csv") as f: for num, line in enumerate(f, 1): if "CCS Stats" in line: csv_split=num df_runstats_poly = pd.read_csv("run_stats.csv", skiprows=2, nrows=csv_split-3) df_runstats_ccs = pd.read_csv("run_stats.csv", skiprows=csv_split)
纯Pandas实现方案
核心思路是先用Pandas读取整个文件的所有行,定位到分隔行的位置,再分别读取两个数据区块:
import pandas as pd # 读取整个文件为无表头的Series,每一行对应一个元素 all_lines = pd.read_csv("run_stats.csv", header=None, squeeze=True) # 找到包含"CCS Stats:"的行的索引(Pandas索引从0开始) split_idx = all_lines[all_lines.str.contains("CCS Stats:")].index[0] # 读取Polymerase Stats区块:跳过前2行,读取到split_idx-1行 df_poly = pd.read_csv("run_stats.csv", skiprows=2, nrows=split_idx - 2) # 读取CCS Stats区块:跳过split_idx行,直接读取数据 df_ccs = pd.read_csv("run_stats.csv", skiprows=split_idx + 1)
代码说明
- 读取所有行:通过
header=None和squeeze=True将整个文件转为一维Series,方便快速定位分隔行。 - 定位分隔行:利用
str.contains筛选目标标题行,获取其0基索引值。 - 拆分读取区块:
Polymerase Stats区块:跳过前2行(RUNID和区块标题行),读取行数为split_idx - 2,对应从数据表头行到CCS标题行的前一行。CCS Stats区块:跳过split_idx + 1行,直接从该区块的数据表头行开始读取。
这种方法全程使用Pandas API完成,无需手动操作文件句柄枚举行,更贴合Pandas的使用逻辑。
内容的提问来源于stack exchange,提问作者kevin41
相关产品推荐
相关产品推荐

