gpt4 book ai didi

python - 如何制作更高效的代码来搜索 Pandas 列中的多个字符串

转载 作者:行者123 更新时间:2023-12-04 18:55:08 27 4
gpt4 key购买 nike

我是一名新近自学成才的(减去 1 节非常基础的类(class))程序员,在生物实验室工作。我有一个脚本,它遍历来自两种不同细胞类型的 RNAseq 数据,并在另一个数据集中运行 ttest。它适用于这个应用程序,但代码感觉非常粗鲁,我知道我会写很多类似的脚本。

如何更好地编写以下代码以使其更高效?

计划目标:

  • 将基因列表与两种细胞类型的 rnaseq 文库进行比较,如果该文库包含该基因,则运行细胞类型 1 与细胞类型 2 的 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向您展示过滤掉我们需要的行的效果。

    >>> import pandas as pd
    >>> from scipy.stats import ttest_ind
    >>> GOIlist = ["GeneA","GeneB"]
    >>> rnatest = {'Gene symbol':["GeneA","GeneB", "GeneC"],"rnaseq1A":[1,1.5,2],"rnaseq1B":[1.3,1.2,1.1],"rnaseq2A":[2.3,2.7,3.1],"rnaseq2B":[2,2.6,3.2]}
    >>> df = pd.DataFrame(rnatest)
    >>> print(df)

    Gene symbol rnaseq1A rnaseq1B rnaseq2A rnaseq2B
    0 GeneA 1.0 1.3 2.3 2.0
    1 GeneB 1.5 1.2 2.7 2.6
    2 GeneC 2.0 1.1 3.1 3.2

    现在我将如何重写您的代码:
  • 使用 set_index制作 Gene symbol排一个索引,这会加速
    增加查找时间(特别是如果您有大型数据帧)
  • 使用 loc过滤掉具有在 GOIlist 中的基因符号的行
  • 创建两个新列 pValtVal您将 ttest_ind 的输出分配给它.请注意,我们不必再遍历行了。
  • 或者,删除 rnaseq*如果您不想在输出中看到它们,请使用列。

  • 在代码中:
    >>> df3 = df.set_index(['Gene symbol'])
    >>> df3 = df3.loc[GOIlist]
    >>> df3['tVal'], df3['pVal'] = ttest_ind([df3["rnaseq1A"], df3["rnaseq1B"]], [df3["rnaseq2A"], df3["rnaseq2B"]])
    >>> df3 = df3.drop(['rnaseq1A', 'rnaseq1B', 'rnaseq2A', 'rnaseq2B'], axis=1)
    >>> print(df3)
    tVal pVal
    Gene symbol
    GeneA -4.714045 0.042174
    GeneB -8.221922 0.014473

    那么,现在这段代码的效率有多高呢?

    如果我人为地将 DataFrame 的大小增加 10.000 倍(因此总共 30.000 行而不是 3 行)
    n = 10_000
    rnatest = {'Gene symbol':["GeneA","GeneB", "GeneC"]*n, "rnaseq1A":[1,1.5,2]*n, "rnaseq1B":[1.3,1.2,1.1]*n, "rnaseq2A":[2.3,2.7,3.1]*n, "rnaseq2B":[2,2.6,3.2]*n}
    df = pd.DataFrame(rnatest)

    那么我可以使用 timeit 来衡量代码的执行时间。对于您的原始方法,我得到了结果:
    13.7 s ± 555 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

    当我的方法结束时
    45.2 ms ± 1.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

    所以这是一个 more than 300 times加速!

    关于python - 如何制作更高效的代码来搜索 Pandas 列中的多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59868101/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com