2016-08-31 3 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)'을 쓸 수 있다는 것을 알고 있습니다. 여기에 람다 함수가 필요 없습니다. – IanS

+0

... 왜 거기에 람다가 있습니까? 감사! 나는 루프 내의 모든 것을 생각하는 다른 함수의 행을 반복하는 데 익숙하다. –

+0

당신이 제안한대로 나는 람다를 꺼내었고 기능이 제대로 작동한다고 생각하기 전에 이미 텍스트를 수집 했더라도 모든 '텍스트'셀을 다시 쓰고 있습니다. –

답변

4

passNone을 반환합니다.

+0

당신은 나를 때려 : – IanS

+0

고마워! 방금 볼 수 없었던 간단한 대답이 있습니다. 함수를 적용하는 것보다는 루프로 생각하고 있었기 때문에 널 체크가 False라면'pass'가 필요하다고 생각했습니다. 'pass '가 뭔가를 반환 할 것이라는 것을 깨닫지 못했고, 다음 반복으로 넘어갈 것이라고 생각했지만 분명히 실제로 반복하지는 않습니다.'else : pass '를 완전히 빼면 제대로 작동합니다. –

+0

@ JamesAllen-Robertson 제가 도울 수있어서 기쁩니다. Python의 함수 * 항상 * return * something * (예외가 실행을 중단하지 않는 한). BTW - 프로필을 확인한 결과 NLP에 관심있는 미디어 이론가임을 알았습니다. 어떤 문제에 대한 여분의 눈 모음이 필요하거나 주제 모델링, 언어 모델 등을 이야기하고 싶다면 gmail에서 내 stackoverflow 사용자 이름에 한 줄을 남겨주세요. 또한, 귀하의 문제를 해결할 경우, 나는 받아 들일 수 감사드립니다 :) –