我有一个包含pubmed文章的数据集,还有一篇包含每篇文章作者的专栏,如下所示:
DOI Fullnames
0 10.1016/0022-1759(96)00092-0 B I Korelitz, S C Sommers
1 10.1038/jhg.2017.16 Avi Saskin 1 , Vanessa Fulginiti 1 , Ashley ...
2 10.1007/s00415-005-0964-z M Tiberio 1 , D T Chard, D R Altmann, G Davie...
3 10.1111/ene.13789 L Bonzano 1 , M Bove 2 , M P Sormani 3 , M ...
4 10.1038/s41598-018-19303-3 Dilek Yonar 1 , Levent Ocek 2 , Bedile Irem ...
5 10.1016/j.yebeh.2016.06.023 Klajdi Puka 1 , Luc Rubinger 2 , Carol Chan ...
6 10.3389/fnins.2019.00618 Paola Valsasina 1 , Milagros Hidalgo de la Cr...
7 10.5152/iao.2018.4467 Teruo Toi 1 , Yasuyuki Nomura 1 , Akihiro Ki...
8 10.1038/cdd.2016.71 Q Yang 1 , C Zheng 1 , J Cao 1 , G Cao 1 ,...
9 10.1002/j.2048-7940.2003 Alexa K Stuifbergen 1 , Tracie Culp Harrison
我的目标是获得一个列有作者姓名的列表,然后应用性别猜测器来获得作者的性别列表。
1.为每篇文章获取一个列,列中包含作者的完整列表
# First create a column with clean list of authors
df['Authorlist']=''
for index, row in df.iterrows():
try:
Fullnames=df.loc[index, 'Fullnames']
authors=list(Fullnames.split(","))
Allauthors = []
for author in authors:
author=''.join([i for i in author if not i.isdigit()])
author=author.rstrip()
author=author.lstrip()
Allauthors.append(author)
df.loc[index, 'Authorlist']=Allauthors
except:
pass
1.为了尝试仅用名字的第一个字母来估算作者的名字,我创建了一个名字可用的作者列表,以便以后当我遇到不完整的名字时,我尝试在列表中查找,看看作者是否在其他地方出现过完整的名字
# Create a list of authors with available first names
Authorswithfullnameslist=[]
for index, row in df.iterrows():
try:
#Fullnames=df.loc[index, 'Authorlist']
for author in df.loc[index, 'Authorlist']:
firstname=author.split()[0]
if len(firstname) > 1:
Authorswithfullnameslist.append(author)
except:
pass
到目前为止,一切都很顺利。然后,当我试图创建一个列有名字列表的列时,事情就不顺利了,正如你所看到的,最终结果是不正确的,我不明白我哪里错了
第一个
你能帮助我理解我错在哪里,或者用其他方法来达到这个结果吗?
1条答案
按热度按时间zxlwwiss1#
我想你会说结果不正确是因为你的 Dataframe 的第8行。你可以看到那里所有的名字都以Y开头,所以这向你展示了你的方法的潜在失败模式。
在第8行,大多数作者是中国人(看姓氏),中国人的姓氏并不是很多样,所以你多次匹配姓氏,因为作者真实的的名字是以Y开头的,所以你保存了所有以Y开头的
completeauthor
名字。潜在补救措施
一旦你从
Authorswithfullnamelist
中添加了一个名字,就退出整个循环以避免更多的匹配。显然,这只会添加第一个找到的姓氏匹配,这可能是不正确的。但是,你的方法并不能保证从一开始就是正确的,所以希望这至少可以防止你为每个作者添加更多的名字。