我正在寻找一种方法来加速我的熊猫数据帧脚本。你知道吗
为了理解这种情况,我将举例说明脚本中涉及的两个数据集。你知道吗
首先我们有“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次/秒?你知道吗
提前谢谢!你知道吗
我实现了apply函数,该函数只返回一个值,当我使用所有需要的代码时,会出现一个错误。你知道吗
所以,在这里思考,在运行zip循环之前,我减少了dbOut。我去掉了重复的dbOut,而不是75000行,只保留Id列的每一个1,并将其保存在dbOut2中,我将其应用于zip循环中。效率是,现在我只需要运行5000行,使事情更快!你知道吗
现在,我尝试将dbOut2中的信息传递给de dbOut。我曾经np.哪里,我读到的是一种非常快速的方式:
那条线应该行得通,但我没有成功。关于如何正确地将dbOut2(5000行)中的信息放入dbOut(75000行)中,有什么建议吗?你知道吗
再次感谢!你知道吗
相关问题 更多 >
编程相关推荐