2013-10-03 4 views
17

팬더에서 str.contains() 함수를 사용하여 한 번에 두 개의 부분 문자열을 검색하는 것이 더 효율적인 방법인지 궁금합니다. "nt"또는 "nv"가 포함 된 데이터에 대해 데이터 프레임의 특정 열을 검색하려고합니다. 바로 지금 내 코드는 다음과 같습니다.데이터 프레임이있는 팬더에서 str.contains() 사용

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)] 

파이썬은 당신이 문자열에 또는 (|) 연산자를 사용하지 않습니다

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

"na = False"표현식에 +1. 내 데이터에 틈이있어 문자열에 함수가 없으면 작동하지 않습니다. –

관련 문제