팬더의 DataFrame에서 "포함하지 않음"검색


142

몇 가지 검색을 수행하고로 데이터 프레임을 필터링하는 방법을 알 수 없지만 df["col"].str.contains(word)그 반대로 수행하는 방법이 있는지 궁금합니다. 그 세트의 칭찬으로 데이터 프레임을 필터링하십시오. 예 :의 효과 !(df["col"].str.contains(word)).

DataFrame방법을 통해이 작업을 수행 할 수 있습니까 ?

답변:


264

부울 데이터가 아닌 것처럼 작동하는 반전 (~) 연산자를 사용할 수 있습니다.

new_df = df[~df["col"].str.contains(word)]

, 어디 new_df RHS에서 사본을 반환합니다.

또한 정규 표현식을 허용합니다 ...


위의 방법으로 ValueError가 발생하면 데이터 유형이 혼합되어 있기 때문일 수 있습니다 na=False.

new_df = df[~df["col"].str.contains(word, na=False)]

또는,

new_df = df[df["col"].str.contains(word) == False]

1
완전한! 나는 정규 표현식에 SQL에 익숙하고 파이썬에서는 그것이 다르다고 생각했습니다 re.complies. 내가 검색을 과도하게 맞추는 것처럼 보이고 그것은 당신이 말한대로입니다
:)

6
어쩌면 전체 예제가 도움이 될 것입니다. df[~df.col.str.contains(word)]단어와 일치하는 제외 행이있는 원래 데이터 프레임의 복사본을 반환합니다.
Dennis Golomazov 2018 년

45

not (~) 기호에도 문제가 있었으므로 다른 StackOverflow 스레드와 다른 방법이 있습니다 .

df[df["col"].str.contains('this|that')==False]

이렇게 결합 할 수 있습니까? df[df["col1"].str.contains('this'|'that')==False and df["col2"].str.contains('foo'|'bar')==True]? 감사!
tommy.carstensen 10

그래 넌 할수있어. 구문은 여기에 설명 : stackoverflow.com/questions/22086116/...
tommy.carstensen

"|"가 포함 된 행을 rwmove하려는 경우를 잊지 마십시오. 우리는 "\"를 사용해야합니다 df = df[~df["col"].str.contains('\|')]
Amir

9

Apply 및 Lambda를 사용하여 열에 목록에있는 항목이 포함 된 행을 선택할 수 있습니다. 시나리오의 경우 :

df[df["col"].apply(lambda x:x not in [word1,word2,word3])]

6

위의 Andy가 권장하는 명령을 사용하기 전에 NULL 값을 제거해야했습니다. 예를 들면 :

df = pd.DataFrame(index = [0, 1, 2], columns=['first', 'second', 'third'])
df.ix[:, 'first'] = 'myword'
df.ix[0, 'second'] = 'myword'
df.ix[2, 'second'] = 'myword'
df.ix[1, 'third'] = 'myword'
df

    first   second  third
0   myword  myword   NaN
1   myword  NaN      myword 
2   myword  myword   NaN

이제 명령을 실행하십시오.

~df["second"].str.contains(word)

다음과 같은 오류가 발생합니다.

TypeError: bad operand type for unary ~: 'float'

dropna () 또는 fillna ()를 사용하여 NULL 값을 먼저 제거하고 문제없이 명령을 다시 시도했습니다.


1
을 ( ~df["second"].astype(str).str.contains(word)를) 강제로 변환하는 데 사용할 수도 있습니다 str. 참조 stackoverflow.com/questions/43568760/...
데이비드 C

1
@Shoresh 우리는 또한이 문제의 해결책으로 na = False를 사용할 수 있습니다
Vishav Gupta

5

답변이 이미 게시 되었기를 바랍니다.

여러 단어 를 찾고 dataFrame에서 그 단어를 무효화 하기 위해 프레임 워크를 추가하고 있습니다.

여기 'word1','word2','word3','word4'= 검색 할 패턴 목록

df = 데이터 프레임

column_a = DataFrame df의 열 이름

Search_for_These_values = ['word1','word2','word3','word4'] 

pattern = '|'.join(Search_for_These_values)

result = df.loc[~(df['column_a'].str.contains(pattern, case=False)]

3

nanselm2의 답변 외에도 다음 0대신 사용할 수 있습니다 False.

df["col"].str.contains(word)==0

다음과 같이 행을 제거하는 것처럼 보입니다.NaN
bshelt141
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.