Python Numpy - совокупный массив numpy для нескольких групп - PullRequest
1 голос
/ 25 мая 2020

У меня есть такой массив:

([(1, 1, 10),
  (1, 1, 20),
  (1, 2, 10),
  (2, 1, 30),
  (2, 1, 40),
  (2, 2, 20)],
  dtype=[('id', '<i8'), ('group', '<i8'), ('age', '<i8')])

И я хотел бы агрегировать этот массив, сгруппировав bu 'id' и 'age', получив среднее значение для возраста.

Я хотел бы получить такой результат:

([(1, 1, 15),
  (1, 2, 10),
  (2, 1, 35),
  (2, 2, 20)],
  dtype=[('id', '<i8'), ('group', '<i8'), ('age', '<i8')])

Я видел простые способы с pandas, но я действительно ищу способ сделать это с numpy. Я пробовал:

unique, uniqueInd, uniqueCount = np.unique(old_array['id'], return_inverse=True, return_counts=True)
means = np.bincount(uniqueInd, old_array['age'])/uniqueCount
new_array = np.dstack([unique, means])

, но не могу заставить его расширяться и группироваться по нескольким столбцам.

Большое спасибо :)!

1 Ответ

2 голосов
/ 25 мая 2020

Вы можете разделить свой бинкаунт с весами на бинкаунт без весов, чтобы получить средства.

import numpy as np

a = np.array([(1, 1, 10),
  (1, 1, 20),
  (1, 2, 10),
  (2, 1, 30),
  (2, 1, 40),
  (2, 2, 20)],
  dtype=[('id', '<i8'), ('group', '<i8'), ('age', '<i8')])


ans, indices = np.unique(a[['id', 'group']], return_inverse=True)
means = np.bincount(indices, a['age']) / np.bincount(indices)
answer = np.empty(means.size, dtype=a.dtype)
answer['id'] = ans['id']
answer['group'] = ans['group']
answer['age'] = means
print(answer)
# [(1, 1, 15) (1, 2, 10) (2, 1, 35) (2, 2, 20)]
...