pandas包所谓的爆炸函数explode

作者: 天地本无心 | 来源:发表于2021-06-23 10:36 被阅读0次

数据分析的时候, 我们有时候会遇到这样的需求.

就比如当一个GO号对应多个Gene ID的时候,如下:

    GO_ids      Gene_ids
0   GO:666666   AT1G12310,AT1G12320,AT1G23330
1   GO:888888   Gene1,Gene2,Gene3

我们想把它变成GO ID和Gene ID一一对应的关系,这样做的目的是为了为基因添加表达量信息或者其它注释信息. 目标表格如下:

    GO_ids      Gene_ids
0   GO:666666   AT1G12310
0   GO:666666   AT1G12320
0   GO:666666   AT1G23330
1   GO:888888   Gene1
1   GO:888888   Gene2
1   GO:888888   Gene3

以前的我也干过这样的事情, 居然是硬写代码, 后来有一次听数据分析的会议, 听到有个人提到Hive里面的爆炸函数, 觉得挺有趣, 想着python数据分析生态系统里不可能没有这样的轮子. 于是搜索了一下, 还真的有.

学习一个工具最好的工具是查文档, 查文档, 查文档.

pandas explode的文档链接如下: pandas explode函数.

This routine will explode list-likes including lists, tuples, sets, Series, and np.ndarray. The result dtype of the subset rows will be object. Scalars will be returned unchanged, and empty list-likes will result in a np.nan for that row. In addition, the ordering of rows in the output will be non-deterministic when exploding sets.

文档里面最重要的一句话是,能够将lists-like的元素"爆炸成"新的行. 下面我们通过一个实例来演示一下, explode函数如何工作.

Jupyter notebook中测试时所用代码块:
#构建测试数据集
import pandas as pd
import numpy as np
df = pd.DataFrame.from_dict({"GO_ids":["GO:666666", "GO:888888"], "Gene_ids":["AT1G12310,AT1G12320,AT1G23330", "Gene1,Gene2,Gene3"]})
df

#将想被explode的列里的元素, 变为list like
df["Gene_ids"] = df["Gene_ids"].apply(lambda x: x.split(","))
#df["Gene_ids"] = df["Gene_ids"].str.split(",")
df

#explode 
df.explode("Gene_ids")

Jupyter notebook中实践.
Step1: 构建测试数据集
Screenshot_2021-06-23_10-30-10.png
Step2: 将想被explode的列里的元素, 变为list like
Screenshot_2021-06-23_10-30-26.png
Step3: explode.
Screenshot_2021-06-23_10-30-38.png

相关文章

网友评论

    本文标题:pandas包所谓的爆炸函数explode

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