Рассчитать динамические c центроиды для каждой строки X в pandas - PullRequest
0 голосов
/ 06 февраля 2020

Следующий код дает мне общий центр тяжести всех чтений моего 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 человека, скажем, для каждого десятого чтение?

Мой 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 строках, например, 10. Таким образом, средний центроид на 10 показаний за раз.

Итак, к 10 строкам за один раз добавьте средний центроид для каждого идентификатора.

1 Ответ

1 голос
/ 06 февраля 2020

Вставьте вспомогательный столбец, чтобы определить группу, а затем используйте шаблон groupby и apply следующим образом:

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)
...