2015-01-26 3 views
2

Можно ли искать строки, содержащие все заданные символы с str.contain?Pandas str.contains, содержащий все заданные символы

Это работает:

df["col1"].str.contains("A") 

Если я хочу, чтобы найти по крайней мере один из указанных символов, это один тоже работает:

df["col1"].str.contains("A|B") 

Однако, если я хочу, чтобы найти строки, которая содержит все данное символов, это не работает

df["col1"].str.contains("A&B") 

Это результат все-ложь.

Рекомендации: Спасибо!

ответ

1

либо

df['col1'].str.contains('A.*B|B.*A') 

или

df['col1'].str.contains('A') & df['col1'].str.contains('B') 

пример:

>>> df 
     col1 
0 wAxyzBw 
1 wBxyzAw 
2 wAxyz 
3 wBxyz 
>>> df['col1'].str.contains('A.*B|B.*A') 
0  True 
1  True 
2 False 
3 False 
Name: col1, dtype: bool 
>>> df['col1'].str.contains('A') & df['col1'].str.contains('B') 
0  True 
1  True 
2 False 
3 False 
Name: col1, dtype: bool 
0

Несколько более общий способ сделать это, если вы ищете большой (или первоначально неизвестно) набор символов:

DataFrame({key: df.col1.str.contains(key) for key in 'AB'}).all(axis=1) 

Там могут быть лучшие способы сделать это (обычно в пандах :), но это дало мне сопоставимую производительность с @ benzad.nouri ответ на 5-мм ряд DF.

4

Другой подход:

df['col1'].apply(set('AB').issubset) 

И некоторые примеры тайминги:

import pandas as pd 
import numpy as np 

strings = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', 'CABA', 'dog', 'cat']) 
%timeit strings.apply(set('AB').issubset) 
# 10000 loops, best of 3: 102 µs per loop 
%timeit strings.str.contains('A.*B|B.*A') 
# 10000 loops, best of 3: 149 µs per loop 
%timeit strings.str.contains('A') & strings.str.contains('B') 
# 1000 loops, best of 3: 712 µs per loop 
+1

Красиво сделано! Одна из забавных вещей о том, чтобы быть здесь, - это изучение других (лучших) подходов к проблеме. – meloncholy

Смежные вопросы