美文网首页
2022-02-21 关于annovar列数不一致的问题.

2022-02-21 关于annovar列数不一致的问题.

作者: greekkey | 来源:发表于2022-02-24 17:38 被阅读0次

    1. 首先建立一个测试文件来看看.

    模拟annovar的结果, 从这个EXCEL生成一个tab分割的txt文件. 行1是表头, 行4和行6是标准行, 行7多一列, 行1数据缺失, 行2用空格, 行5中aa和bb后面有空格.


    image.png

    读取结果如下:


    image.png

    可见pandas会自动根据最大列数读取, 空值被表示成NaN, 空格作为字符串或其一部分处理. 多出来的列会被命名为Unnamed: 8 (列号是从0开始编号).

    2. 试试分行从数组中读取

    import numpy as np
    import pandas as pd
    from pandas import DataFrame
    
    
    # 建立一个数组存储每一行的列数
    #col_num_df = pd.DataFrame(columns=['行','列数'])
    #print(col_num_df)
    
    # 建立一个列表存储每一行的列数
    col_num_list = []
    
    # Windows下需要以\\来表示路径
    f = open("E:\\Downloads\\Book3.txt","r") 
    lines = f.readlines()      #读取全部内容 ,并以列表方式    返回
    print(type(lines))
    for line in lines:
    #    print(line)
        # 这时返回的lines是一个列表, 原表格中的每一行以一个字符串的形式作为这一列表的元素
    #    print(type(line))
    # 使用split函数将字符串分拆成列表
    # 先用'\n'做分隔符去掉末尾的换行
    # 再用'\t'分割
      line_list_temp = line.split('\n')[0]
      print(line_list_temp)
      line_list = line_list_temp.split('\t')
      print(line_list)
      print(type(line_list))
      col_num = len(line_list)
      print(col_num)
    

    结果还是不行, 一次读取全部文件, 还是默认按照最大列数来读取的.
    试一下先不读取整个数组, 逐行从文件中读取行不行.

    3. 逐行读取文件

    # 建立一个数组存储每一行的列数
    #col_num_df = pd.DataFrame(columns=['行','列数'])
    #print(col_num_df)
    
    # 建立一个列表存储每一行的列数
    col_num_list = []
    
    # Windows下需要以\\来表示路径
    for line in open("E:\\Downloads\\Book5.txt","r"):
    #    print(line)
        # 这时返回的lines是一个列表, 原表格中的每一行以一个字符串的形式作为这一列表的元素
    #    print(type(line))
        # 使用split函数将字符串分拆成列表
        # https://blog.csdn.net/doiido/article/details/43204675
        # 先用'\n'做分隔符去掉末尾的换行
        # 再用'\t'分割
        line_list_temp = line.split('\n')[0]
        print(line_list_temp)
        line_list = line_list_temp.split('\t')
        print(line_list)
        print(type(line_list))
        col_num = len(line_list)
        print(col_num)
    
    
    # 这样还是不行, 一次读取全部文件, 还是默认按照最大列数来读取的.
    # 逐行读取也不行
    # 我添加的NaN和表格中的空值在这种操作中被处理成不同的数据.
    

    结果还是不行, 还是按照最大的列数识别.

    4. 那先不管列数了, 先看看能不能直接对每一列进行筛选.

    如果最后一列没有名称, 或者列中数据类型不对的话, 应该也能实现所要的功能.

    import numpy as np
    import pandas as pd
    
    # Windows下需要添加r来表示路径
    file_path=r'E:\Downloads\CS_chr21_hard-filtered_freq_1E-2_anno.hg38_multianno.txt'
    
    Book1_df = pd.read_csv(file_path, sep='\t', encoding='UTF-8')
    print(Book1_df) # 打印数组
    print(Book1_df.info()) # 打印数组信息
    

    运行需要一些时间.
    但是还是正确读取了.
    输出结果:

    sys:1: DtypeWarning: Columns (7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,98,99,100,101,102,103,104,105,106,107,108) have mixed types.Specify dtype option on import or set low_memory=False.
              Chr     Start  ...                                       Otherinfo346                                      Otherinfo347
    0       chr21   5012504  ...                       ./.:.:.:.:.:LowDepth:.:.:.:.                      ./.:.:.:.:.:LowDepth:.:.:.:.
    1       chr21   5030521  ...                       ./.:.:.:.:.:LowDepth:.:.:.:.                      ./.:.:.:.:.:LowDepth:.:.:.:.
    2       chr21   5030613  ...                       ./.:.:.:.:.:LowDepth:.:.:.:.                      ./.:.:.:.:.:LowDepth:.:.:.:.
    3       chr21   5030613  ...                       ./.:.:.:.:.:LowDepth:.:.:.:.                      ./.:.:.:.:.:LowDepth:.:.:.:.
    4       chr21   5030866  ...                       ./.:.:.:.:.:LowDepth:.:.:.:.                      ./.:.:.:.:.:LowDepth:.:.:.:.
    ...       ...       ...  ...                                                ...                                               ...
    451174  chr21  46699956  ...  3/3:0,0,0,2,0:0,0,1,0:2:4:PASS:0,0,0,2,0:0,0,0...  ./.:1,0,0,0,0:0,0,0,0:0:0:LowDepth;LowGQ:.:.:.:.
    451175  chr21  46699956  ...  3/3:0,0,0,2,0:0,0,1,0:2:4:PASS:0,0,0,2,0:0,0,0...  ./.:1,0,0,0,0:0,0,0,0:0:0:LowDepth;LowGQ:.:.:.:.
    451176  chr21  46699956  ...  3/3:0,0,0,2,0:0,0,1,0:2:4:PASS:0,0,0,2,0:0,0,0...  ./.:1,0,0,0,0:0,0,0,0:0:0:LowDepth;LowGQ:.:.:.:.
    451177  chr21  46699966  ...  1/1:0,2:1:2:5:PASS:0,2:0,0:43,6,0:25.763,4.762...              ./.:1,0:0:0:0:LowDepth;LowGQ:.:.:.:.
    451178  chr21  46699967  ...                        ./.:0,2:1:2:0:LowGQ:.:.:.:.              ./.:1,0:0:0:0:LowDepth;LowGQ:.:.:.:.
    
    [451179 rows x 457 columns]
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 451179 entries, 0 to 451178
    Columns: 457 entries, Chr to Otherinfo347
    dtypes: float64(16), int64(3), object(438)
    memory usage: 1.5+ GB
    None
    

    如果有多余的列, 那么这些列应该被自动命名为"Unnamed: (列数)". 这里最后一列的名称是正确的, 所以应该是没有发生数据错列的问题.

    一共有457列, 类型也列出来了.

    但是第一行给了一个警告, 说是有这么一大堆列是混合类型的. 查了一下, Python是分部分读取大文件的, 如果各部分之间数据类型不同, 就会报这个错误. (https://laowangblog.com/python-pandas-csv-dtypewarning-mixed-types.html)
    解决方案有两个, 一个是取消节省内存的设置, 一个是指定列的数据类型, (https://www.roelpeters.be/solved-dtypewarning-columns-have-mixed-types-specify-dtype-option-on-import-or-set-low-memory-in-pandas/)
    但对我来说, 两个选项都不怎么样. 取消节约内存的设置, 不仅仅只是掩耳盗铃, 更容易造成内存溢出(这是一个5.5G的文件, 读取只用了1.5G内存); 指定数据类型, 如果都指定成str, 就没法比较了.
    还是应该先截取前几行, 看看到底是什么样的数据, 应该是什么类型.

    5. 随机获取样本

    参考:
    pandas打印DataFrame的前几行、后几行样本和随机抽样

    # 获取数组的前5行, 后5行和随机100行
    Book1_df_head = Book1_df.head()
    Book1_df_tail = Book1_df.tail()
    Book1_df_sample = Book1_df.sample(n=100)
    
    # 输出到csv文件
    Book1_df_head.to_csv(r'E:\Downloads\Book1_df_head.tsv', sep='\t')
    Book1_df_tail.to_csv(r'E:\Downloads\Book1_df_tail.tsv', sep='\t')
    Book1_df_sample.to_csv(r'E:\Downloads\Book1_df_sample.tsv', sep='\t')
    

    变异频率的中,gnomAD v2.1 genome中, 有些数据是用"." 表示的, 看了几个位点, 这个意思是没有覆盖到(Allele Number=0). 南亚人群数据中这样的位点比较多, 在网站上这样的位点, 频率也被计算成0, 是不对的.
    例: rs150107573
    在gnomAD v2.1.1 exome, EXAC, 以及其他的功能注释中, 没有值的地方保持为空单元格.
    在gnomAD v2.1.1 genome中如果所有人群都没有数据, 也会保持为空单元格; 如果只有个别人群没有数据, 会像上面标'.'
    总之, '.'应该被处理为NaN.

    相关文章

      网友评论

          本文标题:2022-02-21 关于annovar列数不一致的问题.

          本文链接:https://www.haomeiwen.com/subject/qckilrtx.html