2016-08-31 20 views
1
In [1]: df = pd.DataFrame([[pubA, linkA,None], [pubB, linkB,textB], [pubC, linkC,textC]], columns=['pub', 'link','text]) 

In [2]: df 
Out [2]: 
    pub link text 
0 pubA linkA None 
1 pubB linkB textB 
2 pubC linkC textC 

我有我用來從網上拉文本的代碼。我的函數遍歷df並檢查'text'的內容以確保它首先是空的。如果'text'已經有內容,它將會pass。如果'text'爲空,它將檢查'pub'以查看是否爲該出版物提供了適當的BeautifulSoup模板,如果是,則返回乾淨的文本。如果還沒有模板,功能將會是pass熊貓應用的功能擦除數據

def pull_text(row): 
    try: 
     if(pd.isnull(row['text'])): 
      if row['publication' ] == 'PubA': 
       print('Now serving row',row.name,'of',len(df),'Template:',row['publication']) 
       sys.stdout.flush() 

       #Do Template A 
       time.sleep(rand) 
       return article.strip() 

      elif row['publication' ] == 'PubB': 
       #Do Template B 
       time.sleep(rand) 
       return article.strip() 

      elif row['publication' ] == 'PubC': 
       # Do Template C 
       rand = randint(2,10) 
       print('Waiting', rand, 'seconds') 
       sys.stdout.flush() 

       time.sleep(rand) 
       return result.strip() 
      else: 
       pass 
       print('No template set for', row['publication'],':row', row.name) 
     else: 
      pass 
    except AttributeError: 
     print('error at',row.name) 
     sys.stdout.flush() 
     return 'error' 

df['text'] = df.apply (lambda row: pull_text (row),axis=1) 

每個模板工作正常,並從每個出版物中拉出文本。然而每當我運行這個函數(比如在添加一個新模板之後),它似乎就會擦除所有已存在的文本數據並填充已有的空白(它可以)。

In [3] df['text'] = df.apply (lambda row: pull_text (row),axis=1) 
In [4] df 
Out [4] pub link text 
    0 pubA linkA textA 
    1 pubB linkB None 
    2 pubC linkC None 

雖然我的願望是

Out [4] pub link text 
    0 pubA linkA textA 
    1 pubB linkB textB 
    2 pubC linkC textC 

所有我能想到的是,我不知怎麼設置的'text'價值爲空值,如果它是沒有準備好,但我不知道我如何做。

+1

你知道你可以簡單地寫'df.apply(pull_text,axis = 1)'。這裏不需要lambda函數。 – IanS

+0

...爲什麼我在那裏有一個Lambda?謝謝!我習慣於遍歷其他函數中的行,我想到了循環中的所有內容。 –

+0

我按照你的建議帶走了Lambda,而在我相信該功能正常工作之前,即使我已經收集了該文本,現在它正在重寫每個「文本」單元格。 –

回答

4

發生了什麼是pass使您的函數返回None

+0

你打我吧:) – IanS

+0

謝謝!有一個簡單的答案,我只是看不到。我把整個事情想象成一個循環而不是應用一個函數,所以我認爲如果空檢查是False,我需要'pass'。沒有意識到'pass'會返回一些東西,認爲它只會移動到下一個迭代中,但顯然我並沒有實際迭代。只需完全取出'else:pass'並且它工作正常。 –

+0

@ JamesAllen-Robertson我很高興能幫上忙。 Python中的函數* always * return * something *(除非執行被異常中斷)。順便說一句 - 我檢查了你的個人資料,我注意到你是一位對NLP感興趣的媒體理論家。如果你在某些問題上需要額外的眼睛,或者想談論話題建模,語言模型等,請在我的郵箱中用我的計算器用戶名填寫一行。另外,如果這解決了你的問題,我會很感激接受:) –