Numpy и Pandas повторяют значения по бин - PullRequest
0 голосов
/ 31 октября 2018

У меня есть массив Dataframe или Numpy с номерами возрастающих групп, и я хотел бы назначить список значений (равной длины с уникальным числом групп), повторяющихся для каждой группы.

ID - Group
0  -  0
1  -  0
2  -  1
3  -  1
4  -  1
5  -  2
6  -  2
7  -  3

Значения для назначения:

[4, 2, 7, 8] # 4 maps to group 0, 2 maps to group 1 etc

Выход:

ID - Group  - Val
0  -  0     -  4
1  -  0     -  4
2  -  1     -  2
3  -  1     -  2
4  -  1     -  2
5  -  2     -  7
6  -  2     -  7
7  -  3     -  8

Цените любые предложения, желательно без зацикливания, если есть элегантные способы / встроенные функции для их решения (ищите решения Numpy и Pandas).

1 Ответ

0 голосов
/ 31 октября 2018

Настройка :

a = np.array([4, 2, 7, 8])
v = df.Group.values
dct = {}

Вариант 1
Использование индексации numpy. (Это решение предполагает диапазон ваших групп от 0-N:

dct['numpy_indexing'] = a[v]

Вариант 2
Использование np.repeat. (Это решение предполагает, что ваши группы не чересстрочные):

dct['numpy_repeat'] = np.repeat(a, np.bincount(v))

Опция 3
Использование map. Этот подход будет медленнее, чем другие, но он немного более гибок, поскольку допускает чересстрочные и нелинейные группы:

d = dict(zip(np.unique(v), a))

dct['pandas_map'] = df.Group.map(d)

выход

df.assign(**dct)

   ID  Group  numpy_indexing  numpy_repeat  pandas_map
0   0      0               4             4           4
1   1      0               4             4           4
2   2      1               2             2           2
3   3      1               2             2           2
4   4      1               2             2           2
5   5      2               7             7           7
6   6      2               7             7           7
7   7      3               8             8           8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...