【发布时间】:2022-01-14 03:09:12
【问题描述】:
我有一个 csv 文件,其中有一个名为“作者”的列。在该列中,每一行都有几个作者,用逗号分隔。在函数下方的代码中,getAuthorNames 获取该列中的所有作者姓名,并返回一个包含所有作者姓名的数组。
然后函数 authCount 计算个人姓名在“作者”列中出现的次数。起初,我用几百行来做,没有任何问题。现在我正在尝试使用 20,000 行以上来完成它,它已经花费了几个小时,但仍然没有结果。我相信是嵌套的 for 循环和 if 语句导致它花费了这么长时间。任何关于如何加快进程的建议都会有所帮助。我应该使用 lambda 吗?是否有内置的 pandas 功能可以提供帮助?
这是输入数据的样子:
Title,Authors,ID
XXX,"Wang J, Wang H",XXX
XXX,"Wang J,Han H",XXX
这就是输出的样子
Author,Count
Wang J,2
Wang H,1
Han H,1
代码如下:
import pandas as pd
df = pd.read_csv (r'C:\Users\amos.epelman\Desktop\Pubmedpull3GC.csv')
def getAuthorNames(dataFrame):
arrayOfAuthors = []
numRows = dataFrame.shape[0]
cleanDF = dataFrame.fillna("0")
for i in range (0,numRows):
miniArray = cleanDF.at[i,"Authors"].split(",")
arrayOfAuthors += miniArray
return arrayOfAuthors
def authCount(dataFrame):
authArray = getAuthorNames(dataFrame)
numAuthors = len(authArray)
countOfAuth = [0] * numAuthors
newDF = pd.DataFrame({"Author Name": authArray, "Count": countOfAuth})
refDF = dataFrame.fillna("0")
numRows= refDF.shape[0]
for i in range (0,numAuthors):
for j in range (0,numRows):
if newDF.at[i, "Author Name"] in refDF.at[j,"Authors"]:
newDF.at[i,"Count"] += 1
sortedDF = newDF.sort_values(["Count"], ascending = False)
noDupsDF = sortedDF.drop_duplicates(subset ="Author Name", keep = False)
return noDupsDF
finalDF = authCount(df)
file_name = 'GC Pubmed Pull3 Author Names with Count.xlsx'
finalDF.to_excel(file_name)
【问题讨论】:
-
您正在做的是一种非常非常缓慢的方式来处理 pandas 数据框。您可以尝试使用 lambda 函数之类的东西对行进行操作。类似
newDF["Count"] = newDF.apply(lambda row: some function of row, axis=1)(而不是你的 for 循环) -
您应该提供数据样本(作为文本)和预期输出