繁体   English   中英

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

[英]Using pandas, how do I check if a particular sequence exist in a column?

我有一个 dataframe:

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

我希望能够检查特定序列(例如“WOD”)是否存在于“序列”列的任何条目中。 它不必位于条目的中间或末尾,但如果该序列按该顺序存在于该列的任何条目中,则返回 true。

我该怎么做?

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

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

我想要一种 Cltr+F function 可以按该顺序搜索任何序列,无论它在哪里或多长时间。

可以使用str.contains简单地做到这一点:

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

或者,您可以使用str.find

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

失败时返回-1

我们需要在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 语法,你可以这样做:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM