大佬教程收集整理的这篇文章主要介绍了加快模式匹配并在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
按照您编写的顺序应用您编写的每条规则。有两个特殊规则 BEGIN
和 END
可用于前处理。所有其他规则都是 condition { commands }
形式,其中条件可以是正则表达式、数字或字符串条件。
除了上面的 BEGIN
规则(它只是将 输出字段分隔符 (OFS
) 设置为 tab
),还有两条规则。第一个仅适用于 FNR == 1
(文件记录号,例如行号 1
)来处理标题,将标题列值存储在 h
索引数组中并打印标题行。 next
只是跳过所有剩余的规则并告诉 awk 开始处理下一条记录(行)。
当第一个字段 ($1
) 匹配 REGEX [ACGT]
时,当字段 1 是 A
、C
、G
之一时,第二个规则匹配或 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,请注明来意。