我有一个名为df
的大 Dataframe ,大约有4500万行,如下所示。
gene1 gene2 score
0 PIGA ATF7IP1 -0.047236
1 PIGB ATF7IP2 -0.047236
2 PIGC ATF7IP3 -0.047236
3 PIGD ATF7IP4 -0.047236
4 PIGE ATF7IP5 -0.047236
我有一个名为terms
的小 Dataframe ,大小约为3k行。
id gene_set
1 {HDAC4, BCL6}
2 {HDAC5, BCL6}
3 {HDAC7, BCL6}
4 {NCOA3, KAT2B, EP300, CREBBP}
5 {NCAPD2, NCAPH, NCAPG, SMC4, SMC2}
...
2912 {FOXO1, ESR1}
2913 {APP, FOXO3}
2914 {APP, FOXO1}
2915 {APP, FOXO4}
2916 {MAP3K20, MAPK14, AKAP13, MAP2K3, PKN1}
对于每行,我检查terms
数据集中是否存在gene1,gene2
对。
我的代码工作正常,但我想问的是,有什么更快的想法吗?
我已经尝试了几个代码,但运行时间大致相同。
def search(g1,g2):
# search gene pair in the go terms
return sum(terms.gene_set.map(set([g1,g2]).issubset))
代码示例1
np.sum(np.vectorize(search)(df.gene1,df.gene2))
代码示例2
[search(g1, g2) for g1, g2 in zip(df.gene1,df.gene2)]
代码示例3
df[['gene1','gene2']].apply(lambda x: search(x.gene1,x.gene2), axis=1 )
2条答案
按热度按时间pdkcd3nj1#
我看到了一个简单的方法,可以通过将
set([g1,g2])
修改为{g1,g2}.issubset
来加快search
函数的运行速度。由于不再需要将列表转换为集合,因此可以避免大量的工作。这里有一个简单的测试用例
你也可以在函数中传递
terms
Dataframe ,这样解释器就不需要在函数作用域之外寻找它,也许你可以使用pd.Series.sum()
函数而不是调用Python函数(这也应该加快速度)。除此之外,您可以尝试使用Polars或Dask的
df.apply()
方法,以获得更大的速度提升。qmb5sa222#
如果你
.explode
较小的术语dataframe摆脱集。然后可以使用
.isin
要查找相应的匹配项,请执行以下操作:
所用样品: