数据分析的时候, 我们有时候会遇到这样的需求.
就比如当一个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")
网友评论