簡體   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