处理2GB癌症基因表达CSV:删除第四段为-11A的列
嘿,这个需求太常见了!处理2GB级别的TCGA基因表达CSV,直接硬塞内存肯定容易翻车,给你两个实用方案,按需pick:
方案1:Python Pandas分块处理(适合Python玩家)
如果平时习惯用Python,这个方法灵活且易调试,核心思路是分块读取+按需筛选,避免一次性加载整个大文件:
import pandas as pd # 第一步:先读取表头,筛选出需要保留的列(不用加载全量数据) header = pd.read_csv("your_cancer_data.csv", nrows=0).columns.tolist() # 按'-'分割列名,判断第四段是否为11A,只保留不符合条件的列 keep_columns = [col for col in header if col.split('-')[3] != '11A'] # 第二步:分块读取原文件,逐块筛选并写入新文件 chunk_size = 1000 # 可根据你的内存情况调整,比如2000、5000都行 with pd.read_csv("your_cancer_data.csv", chunksize=chunk_size) as reader: for idx, chunk in enumerate(reader): # 只保留目标列 filtered_chunk = chunk[keep_columns] # 第一块写入表头,后续块跳过表头 filtered_chunk.to_csv("filtered_cancer_data.csv", mode='a', header=(idx == 0), index=False)
小贴士:先拿一小段测试数据跑一遍,确认筛选逻辑没问题再处理全量文件,避免白忙活!
方案2:Awk命令行处理(超大文件首选,速度拉满)
如果熟悉终端操作,用Awk处理这种结构化文本效率极高,内存占用极低,直接一行命令搞定:
awk -F',' ' NR==1 { # 处理表头:记录需要保留的列索引 for(i=1; i<=NF; i++) { split($i, parts, "-") if(parts[4] != "11A") { keep[i] = 1 printf "%s", $i if(i < NF) printf "," } } printf "\n" next } { # 处理数据行:只输出保留的列 for(i=1; i<=NF; i++) { if(keep[i]) { printf "%s", $i if(i < NF) printf "," } } printf "\n" }' your_cancer_data.csv > filtered_cancer_data.csv
这个命令的逻辑和Python版本一致,但处理速度快很多,适合处理几十GB级别的文件都不在话下。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

