程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了加快模式匹配并在python中替换大文件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决加快模式匹配并在python中替换大文件?

开发过程中遇到加快模式匹配并在python中替换大文件的问题如何解决?下面主要结合日常开发的经验,给出你关于加快模式匹配并在python中替换大文件的解决方法建议,希望对你解决加快模式匹配并在python中替换大文件有所启发或帮助;

我有一个非常大的文件(10Gb),看起来像这样

ref     R       A       C       G       T
N       0       0       0       0       0
A       5       5       0       0       0
N       0       0       0       0       0
C       8       0       8       0       0
N       0       0       0       0       0
A       6       6       0       0       0
T       0       0       0       0       0

因此,对于 R=0 的所有条目,如果引用为 A|C|G|T,则在其各自的列中将 0 替换为 25。我想要看起来像下面的东西

ref     R       A       C       G       T
A       5       5       0       0       0
C       8       0       8       0       0
A       6       6       0       0       0
T       0       0       0       0       25

这是我尝试过的。它工作正常,但需要太多时间。想知道是否有更快的方法来做到这一点

import pandas as pd
df=pd.read_csv("test",delimiter = "\t",header=0)
for index,row in df.iterrows():
    if Df.loc[index,'R']==0:
        if Df.loc[index,'ref']=="A":
            df.loc[index,'A_pp']=25
        if Df.loc[index,'ref']=="T":
            df.loc[index,'T_pp']=25
        elif Df.loc[index,'ref']=="C":
            df.loc[index,'C_pp']=25
        elif Df.loc[index,'ref']=="G":
            df.loc[index,'G_pp']=25

df_filtered = df[df['ref']!= "N"]
df_filtered.to_csv('./test_formatted.txt',sep = "\t")          

解决方法

关键是根本不用python。这是 awk 的专长,单独使用 awk 会快几个数量级,例如

编辑 - 提高效率

awk '
    BEGIN { OFS="\t" } 
    FNR==1 {
        for (i=1; i<=NF; i++) 
            h[$i] = ++n
        print
        next
    } 
    $1~/[ACGT]/ {
        if ($h[$1] == 0)
            $h[$1] = 25
        print
    }
' file

awk 一次处理一条记录(行),每个字段可用作 $1,... $NF(其中 NF 是字段数)。 awk 按照您编写的顺序应用您编写的每条规则。有两个特殊规则 BEGINEND 可用于前处理。所有其他规则都是 condition { commands } 形式,其中条件可以是正则表达式、数字或字符串条件。

除了上面的 BEGIN 规则(它只是将 输出字段分隔符 (OFS) 设置为 tab),还有两条规则。第一个仅适用于 FNR == 1(文件记录号,例如行号 1)来处理标题,将标题列值存储在 h 索引数组中并打印标题行。 next 只是跳过所有剩余的规则并告诉 awk 开始处理下一条记录(行)。

当第一个字段 ($1) 匹配 REGEX [ACGT] 时,当字段 1 是 ACG 之一时,第二个规则匹配或 T 字符类中的 [...]。如果是,则循环遍历字段数并检查 h 数组中的哪个索引与第一个字段匹配,以及该字段中存储的值是否为 0。如果是,则字段的值设置为等于 25。该行已打印。

示例使用/输出

使用名为 gene 的文件中的数据,您将:

$ awk '
>     BEGIN { OFS="\t" }
>     FNR==1 {
>         for (i=1; i<=NF; i++)
>             h[$i] = ++n
>         print
>         next
>     }
>     $1~/[ACGT]/ {
>         if ($h[$1] == 0)
>             $h[$1] = 25
>         print
>     }
> ' gene
ref     R       A       C       G       T
A       5       5       0       0       0
C       8       0       8       0       0
A       6       6       0       0       0
T       0       0       0       0       25

检查一下,让我知道我是否正确理解了您的替代品,如果没有,请发表评论,我很乐意为您提供进一步帮助。

大佬总结

以上是大佬教程为你收集整理的加快模式匹配并在python中替换大文件全部内容,希望文章能够帮你解决加快模式匹配并在python中替换大文件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。