2013-10-03 4 views
17

Мне интересно, есть ли более эффективный способ использования функции str.contains() в Pandas для поиска двух частичных строк сразу. Я хочу выполнить поиск по определенному столбцу в dataframe для данных, содержащих либо «nt», либо «nv». Сейчас мой код выглядит так:Использование str.contains() в pandas с dataframes

df[df['Behavior'].str.contains("nt", na=False)] 
    df[df['Behavior'].str.contains("nv", na=False)] 

И затем я прилагаю один результат к другому. Я хотел бы использовать одну строку кода для поиска любых данных, которые включают «nt» ИЛИ «nv» ИЛИ «nf». Я играл с некоторыми путями, которые, как я думал, должны работать, в том числе просто придерживаться трубы между терминами, но все это приводит к ошибкам. Я проверил документацию, но я не рассматриваю это как вариант. Я получаю такие ошибки:

--------------------------------------------------------------------------- 
    TypeError         Traceback (most recent call last) 
    <ipython-input-113-1d11e906812c> in <module>() 
    3 
    4 
    ----> 5 soctol = f_recs[f_recs['Behavior'].str.contains("nt"|"nv", na=False)] 
    6 soctol 

    TypeError: unsupported operand type(s) for |: 'str' and 'str' 

Есть ли быстрый способ сделать это? Спасибо за любую помощь, я новичок, но я ЛЮБЛЮ панды для борьбы с данными.

ответ

32

одно регулярное выражение и должно быть в одной строке:

"nt|nv" # rather than "nt" | " nv" 
f_recs[f_recs['Behavior'].str.contains("nt|nv", na=False)] 

Python не позволяет использовать или (|) оператор на строки:

In [1]: "nt" | "nv" 
TypeError: unsupported operand type(s) for |: 'str' and 'str' 
+2

благодаря такой красоты! , осторожно, хотя между трубой и поисковыми терминами не должно быть места! – jaknap32

+3

@ jaknap32: Если вы используете модификатор '(? X)', вы можете добавлять пробелы везде, где хотите - '' (? X) nt | nv "' - (но если у вас есть осмысленные пробелы в шаблоне, вам нужно будет избегать их, а также '#' char). См. [Python 're.X' docs] (https://docs.python.org/2/library/re.html#re.VERBOSE). Во всяком случае, 'n [tv]' является лучшим регулярным выражением, чем 'nt | nv'. –

+0

+1 для выражения «na = False». У моих данных есть пробелы, и моя строка содержит функцию, которая не будет работать без нее. –

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