복붙노트

[PYTHON] 판다에있는 문자열 목록이있는 str.contains를위한 확장 가능한 솔루션

PYTHON

판다에있는 문자열 목록이있는 str.contains를위한 확장 가능한 솔루션

문자열 개체 행을 포함하는 팬더 데이터 프레임 df1을 구문 분석하고 있습니다. 나는 키워드의 참조 목록을 가지고 있고 참조 목록의 단어가 들어있는 df1의 모든 행을 삭제해야합니다.

현재, 나는 이것을 이렇게한다 :

reference_list: ["words", "to", "remove"]
df1 = df1[~df1[0].str.contains(r"words")]
df1 = df1[~df1[0].str.contains(r"to")]
df1 = df1[~df1[0].str.contains(r"remove")]

수천 단어까지 확장 할 수있는 것은 아닙니다. 그러나, 내가 할 때 :

df1 = df1[~df1[0].str.contains(reference_word for reference_word in reference_list)]

나는 첫 번째 인수가 문자열 또는 컴파일 된 패턴이어야합니다 오류를 양보.

이 솔루션을 따라, 나는 시도했다 :

reference_list: "words|to|remove" 
df1 = df1[~df1[0].str.contains(reference_list)]

예외를 발생시키지 않지만 모든 단어를 eather로 구문 분석하지는 않습니다.

단어 목록과 함께 str.contains를 효과적으로 사용하는 방법?

해결법

  1. ==============================

    1.확장 가능한 솔루션의 경우 다음을 수행하십시오.

    확장 가능한 솔루션의 경우 다음을 수행하십시오.

    0 번째 열을 색인화하려면 df1 [0]을 사용하지 마십시오 (모호한 것으로 간주 될 수 있음). loc 또는 iloc (아래 참조)을 사용하는 것이 좋습니다.

    words = ["words", "to", "remove"]
    mask = df1.iloc[:, 0].str.contains(r'\b(?:{})\b'.format('|'.join(words)))
    df1 = df1[~mask]
    

    참고 : 단어가 시리즈 인 경우에도 적용됩니다.

    또는, 0 번째 열이 단어의 열 (문장이 아님) 인 경우 df.isin을 사용할 수 있습니다.이 경우 df.isin은 더 빨라야합니다.

    df1 = df1[~df1.iloc[:, 0].isin(words)]
    
  2. from https://stackoverflow.com/questions/47937697/scalable-solution-for-str-contains-with-list-of-strings-in-pandas by cc-by-sa and MIT license