删除字符串中包含除A、C、T、G、N以外的其他字母的行

2024-10-03 09:10:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我对numpypandas相当陌生,假设我有一个2D numpy数组,我需要删除第二个值仅包含字母'A''C''T''G''N'的所有行

file = 
[['id' 'genome'],
 ['0' 'ATGTTTGTTTTT'],
 ['1' 'ATGTTTGTXXXX'],
 ['2' 'ATGDD2GTTTTT']
]

所以过滤后我可以得到这个

[['id' 'genome'],
 ['0' 'ATGTTTGTTTTT']]

我想对每个字符逐个进行检查的循环执行3次,但当我有500行时,速度太慢了


Tags: numpyidpandasgenome字母数组字符速度
3条回答

使用^{}表示值,使用^表示开始,使用$表示字符串结束:

file = [['id', 'genome'],
 ['0', 'ATGTTTGTTTTT'],
 ['1', 'ATGTTTGTXXXX'],
 ['2', 'ATGDD2GTTTTT']
]
 
df = pd.DataFrame(file[1:], columns=file[0])
print (df)


df = df[df['genome'].str.contains('^[ACTGN]+$')]
print (df)
  id        genome
0  0  ATGTTTGTTTTT

其他答案可能更有效,因为它们使用本机功能。如果您使用Python更方便,那么可以使用map执行过滤

df = DataFrame(
    data={
        'id': [0, 1, 2],
        'genome': ['ATGTTTGTTTTT', 'ATGTTTGTXXXX', 'ATGDD2GTTTTT']
    }
)

filtered_df = df[df['genome'].map(lambda x: re.sub('[ACTGN]+', '', x) == '')]

最后一行:

  • 使用map在每行上运行函数
  • lambda语法意味着:对于每个值x,使用函数re.sub('[ACTGN]+', '', x) == ''
  • 函数的作用是将ACTGN中的任何字符替换为空白
  • ''替换已知的字符后,如果字符串为空,则我们希望保留该行

这种方法的优点是,您可以在这些值上使用任何python代码

filtered_df = df[df['genome'].map(lambda x: <any-code-you-want-that-yields-a-boolean>)]

另一个选项是str.match,模式与@jezrael的答案相同:

df = df[df['genome'].str.match('^[ACTGN]+$')]

此外,我们还可以检测str.contains上带否定的非法字符:

# [^ACTGN] detects any characters that are not ACTGN
df = df[~df['genome'].str.contains('[^ACTGN]')]

相关问题 更多 >