2017-03-29 57 views
0

我想不出另一種方法來優化我的代碼。我使用了一個嵌套for循環,我的電腦崩潰。所以我認爲這個問題是我的代碼。我想要一些幫助。提高Python中循環的性能

我需要檢查一個字符串列表(基本上是單詞)是否在我的df列的行中。它需要經過每一行並檢查單詞是否在那裏。我認爲這不會那麼困難。那麼我是非常錯誤的。我導入了excel文件。總共有3個。

filename='XXXX' 
df = pd.read_excel(filename, sheetname='Data',index_col=0)` 

df.columns:[['text', 'date', 'books', 'price']] 


list_1 = ['apple', 'orange' , 'lime', 'pear'] 
list_2 = ['#loveapple', '#hateorange', '#likepear'] 

a = [] 
for word in df.text: 
    for fruit in list_1: 
     for tag in list_2: 
      if fruit in word: 
       fruit_list =fruit,word 
      elif tag in word: 
       tag_list = tag, word 
       all_data = [fruit_list,tag_list] 
       a.append(all_data) 

TypeError: 'in ' requires string as left operand, not numpy.int64

(我跑過去,但現在它說類型錯誤)

我一直在閱讀一些職位,但我無法找到你消磨整個名單的情況下, 。我找到的例子只顯示一個字符串,它不能用於列表。我也試過其他工具,如xxx.str.contains,但它沒有奏效。

我把word兩次,所以我可以合併word上的2個表。但是,它迭代的行數超過35k,因此根本無法工作。我需要首先「過濾」數據,以便稍後進行分析。

在此先感謝。

+2

要清楚:是list_2的字符串列表?如果是這樣,它應該被初始化爲list_2 = ['#loveapple','#hateorange','#likepear'] – Robbie

+0

上面的第三行包含以散列(#)開頭的無效變量。你不能這樣做!如果這些是字符串,應該引用它們。你會得到什麼錯誤?另外,列表中沒有'ppend'方法! – polarise

+0

@robbie是的,我只是將它們導入爲字符串。抱歉!應該像你所說的那樣引用。 – MLPy

回答

0

您可以在pandas列上使用apply方法。編寫執行你希望做比較的功能,然後將該功能相應的列如:

def compare_string(s): 
    s = str(s) # This is necessary in case there are empty values in your Excel file. 
    list_1 = ['apple', 'orange' , 'lime', 'pear'] 
    for fruit in list_1: 
     if fruit in s: 
      ... 

然後您只要致電:

a = df.text.apply(compare_string) 

如果您在您的Excel的任何空值文件,它們將被讀作numpy.nan,它是numpy.int64類型。這可能就是爲什麼你會遇到類型錯誤。使用apply方法並將列中的每個元素轉換爲一個字符串應該注意TypeError,並提高代碼的清晰度/性能。

+0

謝謝。請在列表位於函數內時正常工作。但是,當我嘗試通過放置它們的名稱來調用它時,例如def compare_string(s):'s = str(s)#如果Excel文件中有空值,則這是必需的。如果果實爲s:' 'list_1 = ['apple','orange','lime','pear'] 對於list_1中的水果: 當我運行代碼'list_1 = list_1'時,它不工作。我確定這是一個列表。你有什麼想法爲什麼發生這種情況,我該如何解決這個問題?謝謝 – MLPy