我是一名新自学的程序员(基本上少了一节课),在一家生物实验室工作。我有一个脚本,可以遍历来自两种不同细胞类型的RNAseq数据,并在另一个数据集中运行ttest。它为这个应用程序工作,但代码感觉非常野蛮,我知道我将编写类似的脚本很多
如何更好地编写以下代码以提高效率
项目目标:
:
import pandas as pd
from scipy.stats import ttest_ind
rnatest = {'Gene symbol':["GeneA","GeneB"],"rnaseq1A":[1,1.5],"rnaseq1B":[1.3,1.2],"rnaseq2A":[2.3,2.7],"rnaseq2B":[2,2.6]}
df = pd.DataFrame(rnatest)
GOIlist = ["GeneA","GeneB"]
GOI = []
mu = []
pval = []
for index, row in df.iterrows():
if row['Gene symbol'] in GOIlist:
t, p = ttest_ind([row["rnaseq1A"],row["rnaseq1B"]],[row["rnaseq2A"],row["rnaseq2B"]])
GOI.append(row['Gene symbol'])
mu.append(t)
pval.append(p)
df2 = {'Gene symbol':GOI,"tVAL":mu, "pVAL":pval}
df2 = pd.DataFrame(df2)
print(df2)
使用
pandas
的优点是可以执行列操作。这些是generally more efficient then iterating over the DataFrame with a for loop我稍微修改了你的
df
,向你展示了过滤掉我们需要的行的效果现在我将如何重写您的代码:
set_index
使Gene symbol
行成为索引,这会加快速度 加快查找时间(尤其是在数据帧较大的情况下)loc
筛选出具有位于GOIlist
中的基因符号的行pVal
和tVal
,为其分配ttest_ind
的输出。请注意,我们不再需要对行进行迭代李>rnaseq*
列,可以选择删除这些列李>代码:
那么,这段代码现在有多高效
如果我人为地将数据帧的大小增加10.000倍(因此总共增加30.000行,而不是3行)
然后我可以使用^{} 来测量代码的执行时间。对于您最初的方法,我得到的结果是:
当我的方法在
所以这是一个more than 300 times加速
相关问题 更多 >
编程相关推荐