熊猫:read_table删除注释行&#39; ##&#39;但不是&#39;#<string>&#39;?

时间:2016-06-18 19:43:17

标签: python pandas

我有一些大的制表符分隔数据集,这些数据集有很长的注释部分,后跟表头,格式如下:

##FORMAT=<ID=AMQ,Number=.,Type=Integer,Description="Average mapping quality for each allele present in the genotype">
##FORMAT=<ID=SS,Number=1,Type=Integer,Description="Variant status relative to non-adjacent Normal, 0=wildtype,1=germline,2=somatic,3=LOH,4=unknown">
##FORMAT=<ID=SSC,Number=1,Type=Integer,Description="Somatic Score">
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  NORMAL  TUMOR
chr1    2985885 .   c   G   .   .   .   GT:IGT:DP:DP4:BCOUNT:GQ:JGQ:VAQ:BQ:MQ:AMQ:SS:SSC    0/0:0/0:202:36,166,0,0:0,202,0,0:255:225:0:36:60:60:0:. 0/1:0/1:321:29,108,37,147:0,137,184,0:228:225:228:36,36:60:60,60:2:225
chr1    3312963 .   C   T   .   .   .   GT:IGT:DP:DP4:BCOUNT:GQ:JGQ:VAQ:BQ:MQ:AMQ:SS:SSC    0/1:0/1:80:36,1,43,0:0,37,0,43:80:195:80:36,31:60:60,60:1:. 0/0:0/0:143:138,5,0,0:0,143,0,0:255:195:255:36:60:60:3:57

##开头的所有内容都是需要删除的注释,但我需要保留以#CHROM开头的标头。有没有办法做到这一点?我为Pandas read_table看到的唯一选项只允许单个字符用于注释字符串,而且我看不到正则表达式的选项。

我使用的代码是:

SS_txt_df = pd.read_table(SS_txt_file,sep='\t',comment='#')

这将删除所有以#开头的行,包括我要保留的标题

编辑:为了澄清,以##开头的标题区域具有可变长度。在bash中,这只是grep -Ev '^##'

2 个答案:

答案 0 :(得分:1)

使用skiprows作为解决方法:

SS_txt_df = pd.read_table(SS_txt_file,sep='\t',skiprows=3)
df
Out[13]: 
  #CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  NORMAL  TUMOR
0  chr1    2985885 .   c   G   .   .   .   GT:IGT...                   
1  chr1    3312963 .   C   T   .   .   .   GT:IGT...           

然后重命名您的第一列以删除#。
 的更新
正如您所说,##因此而异,我知道这不是一个可行的解决方案,但您可以删除以#开头的所有行,然后将列标题作为list传递给您的列改变:

name=['CHROM','POS','ID','REF','ALT','QUAL','FILTER','INFO' ,'FORMAT','NORMAL','TUMOR']

df=pd.read_table(SS_txt_file,sep='\t',comment='#',names=name)
df
Out[34]:
   CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  NORMAL  TUMOR
    0  chr1    2985885 .   c   G   .   .   .   GT:IGT...                   
    1  chr1    3312963 .   C   T   .   .   .   GT:IGT...       

答案 1 :(得分:1)

您可以轻松计算读取CSV文件时必须跳过的标题行数:

fn =  '/path/to/file.csv'

skip_rows = 0
with open(fn, 'r') as f:
    for line in f:
        if line.startswith('##'):
            skip_rows += 1
        else:
            break

df = pd.read_table(fn, sep='\t', skiprows=skip_rows)

第一部分只读取标题行 - 所以它应该非常快