Данные группы Pandas 2-D NumPy по диапазону значений - PullRequest
1 голос
/ 19 июня 2019

У меня большой набор данных в виде двумерного массива. 2D массив представляет данные непрерывной интенсивности, и я хочу использовать это для создания другого 2D массива того же размера только на этот раз, значения сгруппированы в дискретные значения. Другими словами, если у меня есть 2D-массив, подобный этому,

[(11, 23, 33, 12),
 (21, 31, 13, 19),
 (33, 22, 26, 31)]

Выход будет таким, как показано ниже, со значениями от 10 до 19, назначенными для 1, от 20 до 29, назначенным для 2, и от 30 до 39, назначенным для 3.

[(1, 2, 3, 1),
 (2, 3, 1, 1),
 (3, 2, 2, 3)]

В идеале я хотел бы сделать эти назначения на основе процентилей. Например, значения, попадающие в первые десять процентов, присваиваются 5, значения в верхних 20 - 4 и т. Д.

Мой набор данных в формате NumPy. Я посмотрел на функции groupby, но это не позволяет мне определять диапазоны. Я также посмотрел на cut, однако срез работает только на одномерных массивах. Я подумал о том, чтобы пропустить функцию вырезания через цикл при прохождении каждой строки данных, но меня беспокоит, что это может занять слишком много времени. Мои матрицы могут быть размером 4000 строк на 4000 столбцов.

1 Ответ

1 голос
/ 19 июня 2019

Вам нужно stack, чтобы иметь 1-D представление, а затем применить cut.После этого вы можете unstack it.

[tuple(x) for x in (pd.cut(pd.DataFrame(a).stack(), bins=[10,20,30,40], labels=False)+1).unstack().values]

ИЛИ (используя магию @ user3483203 )

[tuple(x) for x in np.searchsorted([10, 20, 30, 40], np.array(a))]

Вывод:

[(1, 2, 3, 1), 
 (2, 3, 1, 1), 
 (3, 2, 2, 3)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...