2014-09-30 2 views
0

지금은 Excel 파일에 설명 된 특정 기준에 따라 행을 제거하는 함수를 만들려고합니다.CSV 파일 (Pandas, Python3)을 기반으로 DF 행 제거

header 
the man 
is a 

내 코드의 두 번째 부분은 내가

import pandas as pd 
data = ({'words':['the man','is a','good guy']}) 
df = pd.DataFrame(data) 

xl = pd.ExcelFile('C:/Users/j/Desktop/bad words2.xlsx') 
badwords = xl.parse() 
badwords = badwords['header'] 

def removewords(x): 
    for w in x: 
     pattern = '^'+''.join('(?=.*{})'.format(word) for word in w.split()) 
     df[df['words'].str.contains(pattern)==False] 
     df.dropna() 


print(removewords(badwords)) 

을 적용하려고 함수 :이 엑셀 파일 (나쁜 words2)는 DF 내에서 제거해야 단어 쌍을 포함하고 있으며 다음과 같습니다 이상적으로,이 기능을 적용의 끝에서, 나는 단지가 포함 된 DF와 끝까지해야합니다

words 
good guy 

그러나 지금,이 함수가 반환하는 모든 것을 '없음'입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

죄송합니다 당신은 단지 패턴에 단어를 필터링하거나 패턴에없는 단어를 필터링하고 싶은거야? 어쨌든 당신이하려는 일이 불분명하지만이 줄은 할당 없이는 아무 일도하지 않습니다 :'df [df [ 'words'] .str.contains (pattern) == False]''df = df [df [ 'words' ] .str.contains (pattern) == False]' – EdChum

답변

1

어떤 생각 :

  1. 마지막 두 작업

    새로운 DataFrame을 반환합니다. 나는. 그들은 DataFrame을 제자리에서 수정하지 않습니다. 이러한 작업의 결과를 무언가에 할당해야합니다. df.
  2. 위의 작업을 수행하면 변수 df을 함수 범위 내에서 할당 할 수 없습니다. 그것을 인수로 전달할 수 있습니다. (참고 : 이는 코드에는 문제가되지 않지만 제안 된 솔루션이 있습니다.) 또는 함수 내에서 새 DataFrame을 인스턴스화 할 수 있습니다.
  3. 함수의 끝에서 DataFrame을 반환하지 않습니다.

대신보십시오 :

def removewords(df,x): 
    for w in x: 
     pattern = '^'+''.join('(?=.*{})'.format(word) for word in w.split()) 
     df = df[df['words'].str.contains(pattern)==False] 
     df = df.dropna() 
    return df 

print(removewords(df,badwords)) 
+0

안녕하세요. 버니가 입력 해 주셔서 감사합니다. 그러나 어떤 유형의 변수를 df (즉 df =)에 할당하려고하면 UnboundLocalError : 로컬 변수 'df'가 할당 전에 참조 됨 오류가 발생합니다. – user3682157

+0

아 맞습니다. 수정 된 답변을 참조하십시오. – bernie

+0

문제가 해결되어 두 번째 문제가 발생합니다. 변경 사항이 for 루프 내에 "스택"되지 않습니다. 위의 코드를 사용하면 반환 값은 "is/good guy"입니다. 내 최종 반환 출력이 '좋은 사람'이되도록 내 Excel 파일에 나타나는 모든 단어 쌍을 제거하고 싶었습니다 – user3682157

관련 문제