查看原文
其他

pandas包里面的一个bug

2017-09-23 天地本无心 生信媛

前几天进城碰到了生信媛,媛问:有朋自乡下来,能复写乎。猿答:大丈夫死且不避,区区公众号安足辞乎,待余文章接收,余定笔耕不辍,徐徐周更。生信媛白了猿一眼:不想写直接说,还说啥子文言文。

而今文章久投不中,盖生信媛言之所预乎?




正经脸。

概要

  • 使用pandas包时遇到的一个bug.

  • 由此引申,如何去掉list里面相邻的重复元素。

  • 当你不能绕开这个bug的时候,如何解决问题。

今年年初,遭受了强烈的中年危机。决定将所有的精力投入到攒文章早日毕业成家立业买房买车买媳妇这个事上,有大半年没有写公众号和知乎专栏了。


你以为你这么说,我就相信你不是因为没东西写了对不对?


慢慢开始写吧,找回当初的学习,分享时的快乐。

昨天晚上干活,有一活儿特别简单。我们做了差异表达基因GO富集分析之后会画一个barchat来呈现结果。作为一个体贴的合作者,想到合作的老师可能会需要知道感兴趣的的GO term里面到底有哪些差异表达基因,把这些基因找出来,加上基因的注释就OK了。

我们需要注意的是,GO和gene之间并不是单纯的一对一的关系,一个基因可能同时属于几个GO terms。

如下图所示,没有用真正的基因号,因为毕竟是合作者的数据。

基因的注释信息如下:

每一个熟悉pandas的人都知道,按列合并文件,就是一行代码的事情。

等等,为什么是这种结果,难道不应该是?

用力擦了擦因为熬夜产生的熊猫眼,再测试一遍,依然是这样。换个文件,依然这样。大晚上的,盯着荧荧灯光对这种结果觉得匪夷所思,心里想又是什么灵异bug。 如果是徐洲更碰到这种问题的话,想必回去查看源码了,而我,只想快速解决问题。搜索了一下,提示可能是是因为pandas版本的问题。

查看自己的服务器的pandas版本。

当我将数据发送到我的本地电脑上的时候,就不能重复我遇到的问题,仿佛一切都正常了。然后我自己的电脑上安装的python版本如下。

事实上在0.13版本里面,pandas的merge功能确实有这么一个bug。如果需要被merge的列里面有重复的元素的话,那么会影响结果的最终呈现。所幸,一定不只有我一个人发现这个问题,在pandas最新版里面就没有这样的问题了。不过还是需要注意,如果你所用的pandas版本不够新的话,即使能够输出结果,但可能不是正确的结果。

既然是重复的列聚集在一起,我们df.drop_replicates()不就好了么,如下。

的确,我们能够看到重复的列去掉了,但是另外一个GO term里面的基因好像丢失了两个。

这个操作就类似于,对于python里面的list1 = [1,2,2,3,3,3,4,4,4,4,3,3,3,2,2,1], 去掉重复的元素之后,变成了[1,2,3,4]。但可能我们有时候会有这种需求,即在一个list里面,我们只想去掉相邻的重复的元素。如上面所说的list1, 处理完之后的结果变成[1,2,3,4,3,2,1], 我们只是去除相邻的重复元素。

针对上面的问题,在这里提供几种python的写法:

Case1


Case1里面, 通过判断如果一个list里面的一个元素和后一个元素是否相同,相同就从原来的list1里面直接删掉该元素。这种写法有一个缺点就是原list也会变动,这里并不推荐,体会这种思想就足够了。

Case2


Case2里面,保留第一个元素,然后从第二个元素开始,判断是否与上一个相同,不相同才保留下来。最后面一行是提供一种列表解析式的方法来一行代码搞定这个问题,我们也能够深刻地体会到,python里面的列表解析式是多么的简洁而强大。

Case3


Case3里面,又是另外一种思路,自己体会一下好了。

Case4:


前面的都是传统的写法,但是还是推荐用itertools里面的groupby这个功能。itertools是一个能够解放生产力的包,每一个功能都能极大地帮你省下代码和运行时间,非常非常值得好好学习一下这个包。


如果是包不够新的问题,那就更新包好了。当我想用pip install upgrade pandas —user来更新包的时候,各种报错。对我们所里的服务器,我也是各种没脾气。那就绕过这种问题,不用pandas里面的merge, 直接写python代码好了。


可能图片上的代码不够清晰,那放个清晰一点的。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存