我有一个 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)
最佳答案
您可以尝试使用 Counter 和 lambda 函数来消除两个数据帧上的嵌套 for 循环,这似乎是添加新列的缓慢方法
from collections import Counter
然后获取“计数”列
author_counts = Counter(list(refDF["Authors"]))
newDF["Count"] = newDF.apply(lambda r: author_counts[r["Author Name"]], axis=1)
关于python - 使用嵌套 for 和 if 循环时加快 Python 速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70705607/