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)
J\xc3\xa9r\xc3\xb4me Richard对O(n log n)
解决方案的见解可以转化为pandas
. 速度取决于数据帧中组的数量和大小。
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