2014-09-30 93 views
0

現在,我試圖創建一個函數,該函數根據excel文件中列出的某些標準刪除行。這個Excel文件(壞words2)包含應該從DF中被刪除的字對,是這樣的:基於CSV文件刪除DF行(Pandas,Python3)

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

功能所以,理想情況下,在使用該功能的目的,我應該結束了,只包含DF:

words 
good guy 

然而,現在,所有的這個函數返回的是「無」。我究竟做錯了什麼?

+0

對不起你只是想過濾掉所有的圖案文字或過濾掉不在模式的話呢?無論如何不清楚你在做什麼,但是這行不做任何事情,沒有賦值:'df [df ['words']。str.contains(pattern)== False]'應該是'df = df [df ['words' ] .str.contains(模式)==假]' – EdChum 2014-09-30 20:04:31

回答

1

的幾點思考:

  1. 最後兩個操作返回一個新的數據幀。即他們不會在原地修改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 2014-09-30 18:47:54

+0

啊是的。請參閱編輯的答案。 – bernie 2014-09-30 18:51:14

+0

所以問題解決了,第二個問題就出現了 - 所做的更改不會在for循環中「堆棧」。所以使用上面的代碼,返回結果是「是個好人」。我希望刪除出現在我的excel文件中的所有單詞對,以便我的最終返回結果是JUST'Good Guy' – user3682157 2014-09-30 18:56:30