使用pandas,如何检查列中是否存在特定序列?

2024-09-28 22:26:19 发布

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

我有一个数据帧:

df = pd.DataFrame({'Sequence': ['ABCDEFG', 'AWODIH', 'AWODIHAWD], 'Length': [7, 6, 9]})

我希望能够检查“sequence”列的任何条目中是否存在特定的序列,比如“WOD”。它不必位于中间或结尾,但如果该顺序在该列的任何条目中都存在,则返回true。p>

我该怎么做

我查看了.isin和.contains,这两个函数仅在列中包含精确且完整的序列时才返回:

df.isin('ABCDEFG') //returns true
df.isin('ABC') //returns false

我想要一种Cltr+F函数,它可以按照这个顺序搜索任何序列,不管它在哪里,也不管它有多长


Tags: 数据函数truedataframedf条目序列length
3条回答

我们需要在contains之前使用str.findall

df.Sequence.str.findall('W|O|D').str.join('').str.contains('WOD')
0    False
1     True
2     True
Name: Sequence, dtype: bool

只需使用^{}即可:

In [657]: df['Sequence'].str.contains('WOD')    
Out[657]: 
0    False
1     True
2     True
Name: Sequence, dtype: bool

或者,您可以使用^{}

In [658]: df['Sequence'].str.find('WOD')
Out[658]: 
0   -1
1    1
2    1
Name: Sequence, dtype: int64

失败时返回-1

如果要使用in语法,可以执行以下操作:

df.Sequence.apply(lambda x: 'WOD' in x)

如果考虑性能,则以下解决方案的速度比其他解决方案快很多倍:

['WOD' in e for e in df.Sequence]

基准

%%timeit
['WOD' in e for e in df.Sequence]
8.26 µs ± 90.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
df.Sequence.apply(lambda x: 'WOD' in x)
164 µs ± 7.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
df['Sequence'].str.contains('WOD')   
153 µs ± 4.49 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
df['Sequence'].str.find('WOD')
159 µs ± 7.84 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
df.Sequence.str.findall('W|O|D').str.join('').str.contains('WOD')
585 µs ± 34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

相关问题 更多 >