簡體   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