Значит между n и n + 1 строкой в ​​объекте pandas groupby? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть групповой объект:

  col1 col2         x         y         z
0    A   D1  0.269002  0.131740  0.401020
1    B   D1  0.201159  0.072912  0.775171
2    D   D1  0.745292  0.725807  0.106000
3    F   D1  0.270844  0.214708  0.935534
4    C   D1  0.997799  0.503333  0.250536
5    E   D1  0.851880  0.921189  0.085515

Как отсортировать объект groupby по следующему:

  col1 col2         x         y         z
0    A   D1  0.269002  0.131740  0.401020
1    B   D1  0.201159  0.072912  0.775171
4    C   D1  0.997799  0.503333  0.250536
2    D   D1  0.745292  0.725807  0.106000
5    E   D1  0.851880  0.921189  0.085515
3    F   D1  0.270844  0.214708  0.935534

А затем вычислите средние значения между строкой A {x, y, z} и строкой B {x, y, z}, строкой B {x, y, z} и строкой C {x, y, z} .. такой что у меня есть:

    col1 col2    x_mean    y_mean    z_mean
0    A-B   D1  0.235508  0.102326   0.58809
1    B-C   D1       ...       ...       ...
4    C-D   D1       ...       ...       ...
2    D-E   D1       ...       ...       ...
5    E-F   D1       ...       ...       ...
3    F-A   D1       ...       ...       ...

Я в основном пытаюсь вычислить середины между вершинами гексагональной структуры (ну ... больше как 10 миллионов). Подсказки приветствуются!

1 Ответ

0 голосов
/ 04 мая 2018

Я полагаю, что вам нужно groupby с rolling и агрегатом mean, в конце для пар используйте shift и удалите первые строки NaN s на группу:

print (df)
 col1 col2         x         y         z
0    A   D1  0.269002  0.131740  0.401020
1    B   D1  0.201159  0.072912  0.775171
2    D   D1  0.745292  0.725807  0.106000
3    F   D2  0.270844  0.214708  0.935534 <-change D1 to D2
4    C   D2  0.997799  0.503333  0.250536 <-change D1 to D2
5    E   D2  0.851880  0.921189  0.085515 <-change D1 to D2
#
df = (df.sort_values(['col1','col2'])
        .set_index('col1')
        .groupby('col2')['x','y','z']
        .rolling(2)
        .mean()
        .reset_index())
df['col1'] = df.groupby('col2')['col1'].shift() + '-' + df['col1']
df = df.dropna(subset=['col1','x','y','z'], how='all')
#alternative
#df = df[df['col2'].duplicated()]
print (df)

  col2 col1         x         y         z
1   D1  A-B  0.235081  0.102326  0.588095
2   D1  B-D  0.473226  0.399359  0.440586
4   D2  C-E  0.924840  0.712261  0.168026
5   D2  E-F  0.561362  0.567948  0.510524
...