python - 使用嵌套 for 和 if 循环时加快 Python 速度

标签 python pandas csv nested

我有一个 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/

相关文章:

python - 如何在 tensorboard 中显示 Tensorflow 2.0 中的 tf.data.Dataset.map 子图?

python - Pandas - 根据多种条件更新列 - 按方法分组

python - 在 Dash 中下载 csv 文件

javascript - 如何从 csv 文件的日期时间戳生成 Google 图表

python - 如何从看起来像 "python shell output"的 python 代码生成文档

python - Tensorflow - 在尝试预测价格时得到不准确的预测、NaN 和无限值

Python 每 4.5MB 分割每个 JSON 文件

arrays - VBA - 在多维数组中分割 CSV 文件

python - Dask 和 fbprophet

python - 如何 reshape Pandas MultiIndex Dataframe(转置每个类别的行,并将它们作为列彼此相邻并保持索引相同)