你听过这句话吗?数据挖掘师们百分之八十的时间都花费在数据清洗上面。小编一入生信队伍,便成为了数据挖掘一员。老板,你想让我对这NG的数据做些什么?去公共数据库,找点某癌症的驱动基因出来。结果就是小编不用循环很久了,毕竟:服务器留你自己用吗?这么玩数据,不花你家内存啊?都不是,不是我的,不花我的,我也要考虑下,一套数据跑出来,时间都去哪了~
经历过循环,经历过时间都去哪了,直到我遇到了Pandas(Python包),这个改变我代码行数的神奇工具,从读入导出csv到遇到的unicode,gbk,中文你不识别还?等问题,到做数据挖掘的工作过程中,数据清洗花费我越来越少的时间(为什么呢?因为pandas基于 numpy的工具,而numpy的是采用C语言编写)。小编的日常,每天使用最多的……从水乳防晒, 变成了Pandas。 后排的同学,明白小编费了这么多口舌的开场是为了什么吧,重要!!!
来到正题,今天给大家分享一点小技巧吧,省时省力的小技巧,也许你也看到过这个函数,也许你看到了这个函数,也没有决定好好用它(来,打脸吧555),现在开始小技能吧。最近在做TCGA数据库相关数据的分析,需要大量的正常样本RNAseq数据,于是GTEx数据库此时上线,她(因为喜欢,所以用她)含有大量的生前健康的人类捐献者的多份尸检样本,涵盖44个组织(42种不同的组织类型)的多类测序数据。大家一定也在我们公众号学习过怎样在UCSV Xena browser下载TCGA数据,那么,同样的方法,你也可以在这儿(https://xenabrowser.net/datapages/)找到xena整理好的level3的数据集(见图1)。
图1
做差异分析之前,要把来自TCGA肿瘤组织数据和GTEx正常组织数据整合到一起。那么问题来了,肿瘤组织含有423个样本,2030个相关基因,文件命名为tumor_data,部分数据如下(图2):
图2
正常组织含有110个样本,75000多个相关基因,文件命名为normal_data,部分数据如下(图3):
图3
既要将两部分数据的共同基因找出来,又要将两部分数据完美无瑕的衔接在一起,即两部分样本都要在一个表里排成一横排,基因还要对齐,我想要的样子如下(图4):
图4
到这你可以想一下什么办法能一步做到这个结果哟。
注意由于通过index做的合并那我们将第一列设置成index就可以啦。
tumor_data = tumor_data.set_index('sample', drop=True)
normal_data = normal_data.set_index('sample', drop=True)
接下来:
tumor_add_norma = pd.concat([tumor_data, normal_data], axis=1, join='inner')
tumor_add_norma = tumor_add_norma.reset_index()
最终的结果含有1.7万左右个基因,481个样本。 Fine ,OK 。PS以上两个待合并文件分别为:59.78M, 3.05G,结果秒秒出。灵感来自pandas的官方文档(图5),用过pandas的盆友一定不陌生,concat这个函数,但是,你有没有更懂她了。
图5
另外,发现没有,reset_index 可以将set_index搞得事情,还原回去呀?是的!它可以。他们就是这样的关系。
数据挖掘中数据处理的第一步就当属数据清洗了,就拿上面的RNA-seq数据来说,其中含有很多表达量为0的数据,为了不影响后续的分析,一般会将百分之五十以上表达量为0的基因去掉。看到图4中的TRHR基因,一排飘0,有没有想盘了它。但是再次你会用什么方法呢?
写个循环?判断下这行有多少个0 ,然后drop掉?
pandas的dropna函数,我们也不陌生呀:
df.dropna(how='all') 删除所有元素均为空值的行
df.dropna(how='any') 删除有空值元素的行
df.dropna(thresh=2) 删除至少有2个空值的行
那么,删掉百分之五十以上表达量为0的基因,就简~单~了~
tumor_add_norma_na = tumor_add_norma.replace(0, np.nan)
tumor_add_norma = tumor_add_norma_na.dropna(thresh=241).fillna(0)
replace?既然用dropna,至少要尊重人家的输入啊,那就先把0值转为NA;thresh=241的原因?因为总共有481个样本,就是481列呀。删掉了大于等于241个为0的行,最后还要记得把空值再填回为0哦,目的达成!
数据已经整理完毕,接下来就要做差异分析了。小编使用的包是DEseq2,由于输入的数据需要是整数型,那在此也对数据做了下处理;
columns_l = tumor_add_norma.columns.tolist()
tumor_add_norma[columns_l] = tumor_add_norma[columns_l].astype('int64')
现在你可以继续做分析啦。
今天的小小分享就到这了。如果大家喜欢的话,我会带来数据处理更多技巧,咦,算不算技巧呢,你们说算的话,才算。反正我踩的坑,我顿悟的好多东西都会分享给美丽帅气的人儿(你)。
参考资料:
http://pandas.pydata.org/pandas-docs/version/0.21/whatsnew.html
更多生信分析需求,请联系电话(同微信号):13120220117