计算熊猫中每X行的动态质心

问题描述 投票:0回答:1

以下代码给了我df所有读数的一般质心。

pos = df4[['x', 'y']].to_numpy() # gives me all the x-,y-coordinates in df4

def centroid(arr):
    length = arr.shape[0]
    sum_x = np.sum(arr[:, 0])
    sum_y = np.sum(arr[:, 1])
    return sum_x/length, sum_y/length

coll_cps = np.array(centroid(pos)) # Create centroids between ids   

我如何创建每个人ID的临时质心的新列,比如说每10次阅读?

我的df看起来像这样:

          x    y    id   time
0       162  282  2700      0
1       162  282  2819      0
2       162  282  2820      0
3       449  235  2700      1
4       449  235  2820      1
5       449  235  2819      1
6       457  293  2819      2
7       457  293  2820      2
8       457  293  2700      2
9       164  283  2700      3
10      164  283  2819      3
11      164  283  2820      3
12      457  293  2700      4
13      457  293  2820      4
14      457  293  2819      4
15      450  235  2700      5
16      450  235  2820      5
17      450  235  2819      5
18      449  234  2700      6
19      449  234  2819      6
20      449  234  2820      6
21      456  293  2820      7
22      456  293  2819      7
23      456  293  2700      7
24      167  277  2820      8
25      167  277  2700      8
26      167  277  2819      8
27      167  277  2820      9
28      167  277  2700      9
29      167  277  2819      9
...  ...   ...    ...

输出应该是一个新列,其中x行内的id之间有临时质心,例如10。因此,一次每10个读数的平均质心。

因此,对于每次10行,请为每个id附加平均质心。

python pandas position coordinates pandas-groupby
1个回答
1
投票

弹出帮助列以识别组,然后使用groupbyapply模式:

import pandas as pd

# some data
x_vals = [1, 2, 3, 10, 11, 20]
y_vals = [2, 4, 6, 0, 10, 0]

data = {'x': x_vals, 'y': y_vals}

df = pd.DataFrame(data)

group_size = 3

# make "helper row" with group number
df['group'] = df.index//group_size



def centroid(row):
    return (row.x.mean(), row.y.mean())

df_centroids = df.groupby('group').apply(centroid)

print(df)
print()
print(df_centroids)

收益率:

    x   y  group
0   1   2      0
1   2   4      0
2   3   6      0
3  10   0      1
4  11  10      1
5  20   0      1

group
0                                  (2.0, 4.0)
1    (13.666666666666666, 3.3333333333333335)
© www.soinside.com 2019 - 2024. All rights reserved.