如何加速数据帧中的循环

Fél*_*ais 6 performance loops numpy dataframe pandas

我想加快循环速度,因为我必须对 900 000 个数据执行此操作。

为了简单起见,我向您展示了一个示例。

我想添加一个列名称“计数”,用于计算同一玩家的得分低于目标得分的次数。但对于每一行,目标都会改变。

输入 :

   index Nom player  score  target score
0      0      felix      3            10
1      1      felix      8             7
2      2       theo      4             5
3      3    patrick     12             6
4      4     sophie      7             6
5      5     sophie      3             6
6      6      felix      2             4
7      7      felix      2             2
8      8      felix      2             3
Run Code Online (Sandbox Code Playgroud)

结果 :

   index Nom player  score  target score  Count
0      0      felix      3            10      5
1      1      felix      8             7      4
2      2       theo      4             5      1
3      3    patrick     12             6      0
4      4     sophie      7             6      1
5      5     sophie      3             6      1
6      6      felix      2             4      4
7      7      felix      2             2      0
8      8      felix      2             3      3
Run Code Online (Sandbox Code Playgroud)

下面是我当前使用的代码,但是可以加快速度吗?我看到了一些关于矢量化的文章是否可以应用于我的计算?如果是的话该怎么做

df2 = df.copy()
df2['Count']= [np.count_nonzero((df.values[:,1] == row[2] )& ( df.values[:,2] < row[4]) )    for row in df.itertuples()]
print(df2)
Run Code Online (Sandbox Code Playgroud)

Mic*_*sny 3

J\xc3\xa9r\xc3\xb4me RichardO(n log n)解决方案的见解可以转化为pandas. 速度取决于数据帧中组的数量和大小。

\n
df2 = df.copy()\ngr = df2.groupby(\'Nom player\')\nlookup = gr.score.apply(np.sort).to_dict()\ndf2[\'count\'] = gr.apply(\n    lambda x: pd.Series(\n        np.searchsorted(lookup[x.name], x[\'target score\']),\n        index=x.index)\n    ).droplevel(0)\nprint(df2)\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
   index Nom player  score  target score  count\n0      0      felix      3            10      5\n1      1      felix      8             7      4\n2      2       theo      4             5      1\n3      3    patrick     12             6      0\n4      4     sophie      7             6      1\n5      5     sophie      3             6      1\n6      6      felix      2             4      4\n7      7      felix      2             2      0\n8      8      felix      2             3      3\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我添加了快速基准测试。这个答案似乎是最快的。 (2认同)