繁体   English   中英

计算 dataframe 的加权平均值,而不使用 python 中的循环

[英]Calculate a weighted average on a dataframe without using a loop in python

假设我有以下 dataframe:

     Individual      stop        x           y           z         time
0    23              1           20          27          4         21
1    23              2           23          24          13        63
2    1756            2           5           41          73        12
3    1756            3           7           42          72        6
4    1756            4           4.5         39          72        45
5    1756            4           3           50          73        98
6    2153            2           121         12          6         33
7    2153            3           122.5       2           6         0
8    3276            1           54          33          -12       0
9    5609            1           -2          44          -32       56
10   5609            2           8           44          -32       23
11   5609            5           102         -23         16        76

我想计算每个人的时间加权 position x、y、z 的平均值。 然后我想将结果放入一个新的 dataframe 中,如下所示:

     Individual          bar_x       bar_y       bar_z  
0    23                  22.5        24.75       10.75
2    1756                3.72        45.96       72.68 
6    2153                121         12          6  
9    5609                50.48       11.15       24.16

我通过循环遍历每个个体并计算加权平均值来完成此操作。 它运行良好,但是当 dataframe 变大时,运行时间很长。 我很确定使用 pandas 有一个更快的解决方案,但我还没有找到方法,请问有什么想法吗?

提前致谢!

这是你想要的?

(df[['x','y','z']].mul(df.groupby('Individual')['time']
.transform(lambda x: x.div(x.sum())).fillna(0),axis=0)
.groupby(df['Individual'])
.sum()
.round(2))

Output:

                 x      y      z
Individual                      
23           22.25  24.75  10.75
1756          3.72  45.96  72.68
2153        121.00  12.00   6.00
3276          0.00   0.00   0.00
5609         50.48  11.15  -8.46

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM