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'
의 값을 설정하고 있다는 것입니다,하지만 난 잘 모르겠어요 내가 어떻게하는지.
당신은'df.apply (pull_text, axis = 1)'을 쓸 수 있다는 것을 알고 있습니다. 여기에 람다 함수가 필요 없습니다. – IanS
... 왜 거기에 람다가 있습니까? 감사! 나는 루프 내의 모든 것을 생각하는 다른 함수의 행을 반복하는 데 익숙하다. –
당신이 제안한대로 나는 람다를 꺼내었고 기능이 제대로 작동한다고 생각하기 전에 이미 텍스트를 수집 했더라도 모든 '텍스트'셀을 다시 쓰고 있습니다. –