关于删除for循环的脚本的问题(iterrows,zip,…)

2024-09-29 17:20:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法来加速我的熊猫数据帧脚本。你知道吗

为了理解这种情况,我将举例说明脚本中涉及的两个数据集。你知道吗

首先我们有“entrydata”,这是我们购买的东西的列表。它有一个名为“date”的列、一个名为“id”的列和一个名为“value”的列,如上表所示:

<table> <tr> <th>Date</th> <th>Id</th> <th>Value</th> </tr> <tr> <td>01/01/2017</td> <td>111</td> <td>58.4</td> </tr> <tr> <td>01/01/2017</td> <td>222</td> <td>120.7</td> </tr> <tr> <td>02/18/2017</td> <td>111</td> <td>59.3</td> </tr> <tr> <td>02/18/2017</td> <td>222</td> <td>130.8</td> </tr> <tr> <td>04/13/2017</td> <td>111</td> <td>59.3</td> </tr> <tr> <td>04/13/2017</td> <td>222</td> <td>130.8</td> </tr> </table>

我们拥有的其他数据是“outdata”,即我们出售的物品列表,我们有一个名为“date”的列,一个名为“id”的列和一个名为“value”的列,如上表所示:

<table> <tr> <th>Date</th> <th>Id</th> <th>Value</th> </tr> <tr> <td>01/03/2017</td> <td>111</td> <td>60</td> </tr> <tr> <td>01/03/2017</td> <td>111</td> <td>60</td> </tr> <tr> <td>01/03/2017</td> <td>111</td> <td>60</td> </tr> <tr> <td>01/03/2017</td> <td>222</td> <td>122</td> </tr> <tr> <td>01/03/2017</td> <td>222</td> <td>122</td> </tr> <tr> <td>02/25/2017</td> <td>222</td> <td>122</td> </tr> <tr> <td>02/25/2017</td> <td>111</td> <td>70</td> </tr> <tr> <td>02/25/2017</td> <td>222</td> <td>135</td> </tr> </table>

使用这些数据集,我编写了一个使用for循环的脚本,如上面的代码:

for row in tqdm(zip(dbOut["Date"],dbOut["Id"],dbOut["Value"])):
    dateOut = row[0]
    idOut = row[1]
    valueOut = row[2]

    #get all entry rows that have idOut id
    dbSample = dbEntry.loc[dbEntry["Id"] == idOut]

    #now do the mean of the column Value
    result = dbSample["Value"].mean()

    #append to an array created before the loop
    valuefinal.append(result)

#out of loop we put it in the outdata dataFrame in a new column
dbOut["FinalValue"] = valuefinal

基本上,剧本就是这么做的。在输入和输出框中有更多的列,但是通过这些示例,我想我恢复了正在进行的工作。你知道吗

这些代码在结果方面工作得很好,但我想加快速度。首先,代码是使用iterrows编写的。在寻找加速的方法时,我发现ItErrors是一个错误的选择。所以我改为itertuples,而不是zip函数。你知道吗

所有这些在结果方面都是有效的,但是迭代的时间没有太大的变化。我说的是大约300次迭代/秒。你知道吗

然后我使用矢量化对部分代码进行了更改,根据entrydata的不同,我得到了600到1200次/秒的迭代次数。你知道吗

部分代码可以矢量化,但另一部分不能!可以矢量化的部分是使用另外两列进行简单减法的部分。你知道吗

使用具有特定Id的精简数据帧的部分无法矢量化,因为它显示以下错误:

ValueError: Can only compare identically-labeled Series objects

我尝试矢量化的代码简单地从循环中删除,并进行了所需的更改。以下是循环中的原始代码:

result = dbSample["Value"].mean

下面是我尝试矢量化消除循环的代码:

dbOut["FinalValue"] = dbEntry.loc[dbEntry["Id"] == dbOut["Id"]]["Value"].mean()

最后,回答问题。我可以对数据帧的特定部分(entryData)进行这种矢量化吗?有什么建议可以让代码运行得更快吗?比如3000次/秒?你知道吗

提前谢谢!你知道吗


Tags: the数据代码脚本idvaluetablemean
1条回答
网友
1楼 · 发布于 2024-09-29 17:20:41

我实现了apply函数,该函数只返回一个值,当我使用所有需要的代码时,会出现一个错误。你知道吗

所以,在这里思考,在运行zip循环之前,我减少了dbOut。我去掉了重复的dbOut,而不是75000行,只保留Id列的每一个1,并将其保存在dbOut2中,我将其应用于zip循环中。效率是,现在我只需要运行5000行,使事情更快!你知道吗

现在,我尝试将dbOut2中的信息传递给de dbOut。我曾经np.哪里,我读到的是一种非常快速的方式:

dbOut["FinalValue"] = np.where(dbOut("ID") == dbOut2("ID"), dbOut2("Value"),0)

那条线应该行得通,但我没有成功。关于如何正确地将dbOut2(5000行)中的信息放入dbOut(75000行)中,有什么建议吗?你知道吗

再次感谢!你知道吗

相关问题 更多 >

    热门问题