2022-02-21 關(guān)于annovar列數(shù)不一致的問題.

1. 首先建立一個測試文件來看看.

模擬annovar的結(jié)果, 從這個EXCEL生成一個tab分割的txt文件. 行1是表頭, 行4和行6是標(biāo)準(zhǔn)行, 行7多一列, 行1數(shù)據(jù)缺失, 行2用空格, 行5中aa和bb后面有空格.


image.png

讀取結(jié)果如下:


image.png

可見pandas會自動根據(jù)最大列數(shù)讀取, 空值被表示成NaN, 空格作為字符串或其一部分處理. 多出來的列會被命名為Unnamed: 8 (列號是從0開始編號).

2. 試試分行從數(shù)組中讀取

import numpy as np
import pandas as pd
from pandas import DataFrame


# 建立一個數(shù)組存儲每一行的列數(shù)
#col_num_df = pd.DataFrame(columns=['行','列數(shù)'])
#print(col_num_df)

# 建立一個列表存儲每一行的列數(shù)
col_num_list = []

# Windows下需要以\\來表示路徑
f = open("E:\\Downloads\\Book3.txt","r") 
lines = f.readlines()      #讀取全部內(nèi)容 ,并以列表方式    返回
print(type(lines))
for line in lines:
#    print(line)
    # 這時返回的lines是一個列表, 原表格中的每一行以一個字符串的形式作為這一列表的元素
#    print(type(line))
# 使用split函數(shù)將字符串分拆成列表
# 先用'\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)

結(jié)果還是不行, 一次讀取全部文件, 還是默認(rèn)按照最大列數(shù)來讀取的.
試一下先不讀取整個數(shù)組, 逐行從文件中讀取行不行.

3. 逐行讀取文件

# 建立一個數(shù)組存儲每一行的列數(shù)
#col_num_df = pd.DataFrame(columns=['行','列數(shù)'])
#print(col_num_df)

# 建立一個列表存儲每一行的列數(shù)
col_num_list = []

# Windows下需要以\\來表示路徑
for line in open("E:\\Downloads\\Book5.txt","r"):
#    print(line)
    # 這時返回的lines是一個列表, 原表格中的每一行以一個字符串的形式作為這一列表的元素
#    print(type(line))
    # 使用split函數(shù)將字符串分拆成列表
    # 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)


# 這樣還是不行, 一次讀取全部文件, 還是默認(rèn)按照最大列數(shù)來讀取的.
# 逐行讀取也不行
# 我添加的NaN和表格中的空值在這種操作中被處理成不同的數(shù)據(jù).

結(jié)果還是不行, 還是按照最大的列數(shù)識別.

4. 那先不管列數(shù)了, 先看看能不能直接對每一列進(jìn)行篩選.

如果最后一列沒有名稱, 或者列中數(shù)據(jù)類型不對的話, 應(yīng)該也能實現(xiàn)所要的功能.

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) # 打印數(shù)組
print(Book1_df.info()) # 打印數(shù)組信息

運行需要一些時間.
但是還是正確讀取了.
輸出結(jié)果:

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

如果有多余的列, 那么這些列應(yīng)該被自動命名為"Unnamed: (列數(shù))". 這里最后一列的名稱是正確的, 所以應(yīng)該是沒有發(fā)生數(shù)據(jù)錯列的問題.

一共有457列, 類型也列出來了.

但是第一行給了一個警告, 說是有這么一大堆列是混合類型的. 查了一下, Python是分部分讀取大文件的, 如果各部分之間數(shù)據(jù)類型不同, 就會報這個錯誤. (https://laowangblog.com/python-pandas-csv-dtypewarning-mixed-types.html)
解決方案有兩個, 一個是取消節(jié)省內(nèi)存的設(shè)置, 一個是指定列的數(shù)據(jù)類型, (https://www.roelpeters.be/solved-dtypewarning-columns-have-mixed-types-specify-dtype-option-on-import-or-set-low-memory-in-pandas/)
但對我來說, 兩個選項都不怎么樣. 取消節(jié)約內(nèi)存的設(shè)置, 不僅僅只是掩耳盜鈴, 更容易造成內(nèi)存溢出(這是一個5.5G的文件, 讀取只用了1.5G內(nèi)存); 指定數(shù)據(jù)類型, 如果都指定成str, 就沒法比較了.
還是應(yīng)該先截取前幾行, 看看到底是什么樣的數(shù)據(jù), 應(yīng)該是什么類型.

5. 隨機獲取樣本

參考:
pandas打印DataFrame的前幾行踪区、后幾行樣本和隨機抽樣

# 獲取數(shù)組的前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中, 有些數(shù)據(jù)是用"." 表示的, 看了幾個位點, 這個意思是沒有覆蓋到(Allele Number=0). 南亞人群數(shù)據(jù)中這樣的位點比較多, 在網(wǎng)站上這樣的位點, 頻率也被計算成0, 是不對的.
例: rs150107573
在gnomAD v2.1.1 exome, EXAC, 以及其他的功能注釋中, 沒有值的地方保持為空單元格.
在gnomAD v2.1.1 genome中如果所有人群都沒有數(shù)據(jù), 也會保持為空單元格; 如果只有個別人群沒有數(shù)據(jù), 會像上面標(biāo)'.'
總之, '.'應(yīng)該被處理為NaN.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昆烁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缎岗,更是在濱河造成了極大的恐慌静尼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鼠渺,居然都是意外死亡鸭巴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門拦盹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹃祖,“玉大人,你說我怎么就攤上這事普舆√窨冢” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵沼侣,是天一觀的道長祖能。 經(jīng)常有香客問我,道長蛾洛,這世上最難降的妖魔是什么养铸? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮轧膘,結(jié)果婚禮上钞螟,老公的妹妹穿的比我還像新娘。我一直安慰自己扶供,他們只是感情好筛圆,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椿浓,像睡著了一般太援。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扳碍,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天提岔,我揣著相機與錄音,去河邊找鬼笋敞。 笑死碱蒙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夯巷。 我是一名探鬼主播赛惩,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趁餐!你這毒婦竟也來了喷兼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤后雷,失蹤者是張志新(化名)和其女友劉穎季惯,沒想到半個月后吠各,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡勉抓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年贾漏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藕筋。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡纵散,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出念逞,到底是詐尸還是另有隱情困食,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布翎承,位于F島的核電站硕盹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叨咖。R本人自食惡果不足惜瘩例,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甸各。 院中可真熱鬧垛贤,春花似錦、人聲如沸趣倾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儒恋。三九已至善绎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诫尽,已是汗流浹背禀酱。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牧嫉,地道東北人剂跟。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像酣藻,于是被迫代替她去往敵國和親曹洽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容