2014-01-10 3 views
23

내 코드에서 이런 일이 :반전, 팬더

df2 = df[df['A'].str.contains("Hello|World")]

그러나, 내가하지을 모든 행 안녕하세요 또는 세계 중 하나를 포함합니다. 어떻게 이것을 가장 효과적으로 되돌릴 수 있습니까?

답변

24

당신은 부울 값 플립 물결표 ~을 사용할 수 있습니다 :이 가장 효율적인 방법을 여부

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]}) 
>>> df.A.str.contains("Hello|World") 
0  True 
1 False 
2  True 
3 False 
Name: A, dtype: bool 
>>> ~df.A.str.contains("Hello|World") 
0 False 
1  True 
2 False 
3  True 
Name: A, dtype: bool 
>>> df[~df.A.str.contains("Hello|World")] 
     A 
1 this 
3 apple 

[2 rows x 1 columns] 

을 모르겠어요; 당신은 다른 옵션들에 대비해서 시간을 정해야합니다. 때로 정규 표현식을 사용하면 df[~(df.A.str.contains("Hello") | (df.A.str.contains("World")))] 같은 것보다 느리지 만 크로스 오버가 어디인지 추측하는 것은 나쁘다.

+0

복잡한 회귀 분석보다 훨씬 뛰어납니다. 그러나 판다 스 자신에 대한 경험이 없으므로 더 빠른 접근 방법이 무엇인지 전혀 알지 못합니다. –

+1

정규식 둘러보기 테스트는 상당히 오래 걸렸으며 (약 30 대 20 초), 두 가지 방법이 분명히 약간 다른 결과를 보였습니다. (3663K 결과와 3G 원본과 비교하여 3504K - 사양을 보지 못했습니다.) – Xodarap777

+0

@DSM 나는이'~'심볼을 자바 스크립트에서 여러 번 본 적이있다. 파이썬으로 보지 못했습니다. 정확히 무엇을 의미합니까? – estebanpdl

7

.contains() 방법은 정규 표현식을 사용하기 때문에 당신은 단어가 하지이 포함 된 것을 확인하기 위해 negative lookahead test를 사용할 수 있습니다

df['A'].str.contains(r'^(?:(?!Hello|World).)*$') 

이 표현은 단어 HelloWorld하지을있는 모든 문자열과 일치 문자열의 어디에서나 발견됩니다.

데모 :

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]}) 
>>> df['A'].str.contains(r'^(?:(?!Hello|World).)*$') 
0 False 
1  True 
2 False 
3  True 
Name: A, dtype: bool 
>>> df[df['A'].str.contains(r'^(?:(?!Hello|World).)*$')] 
     A 
1 this 
3 apple 
+0

C : \ Python27 \ lib \ site-packages \ pandas \ core \ strings.py가 있습니다. 176 : UserWarning :이 패턴에는 일치 그룹이 있습니다. 실제로 그룹을 가져 오려면 str.extract.'를 사용하십시오. – Xodarap777

+1

그룹을 캡처하지 않습니다. –