Можно ли сортировать по нескольким полям в массивном структурированном массиве с некоторым обратным, как SQL ORDER BY
Я загрузил результаты запроса SQL (MySQLdb) в массивный структурированный массив. Теперь я хочу отсортировать массив различными способами. Поля представляют собой смешанный пакет с строками, целыми числами, числами с плавающей запятой и объектами Python (для столбцов, которые вернулись с NULLS). Я посмотрел на этот вопрос, но, как Askewchan упоминает в нижней части своего ответа, он не работает для строк и не работает для объектов Python (например, int, но из столбца с NULLS).
Есть ли способ сортировки одномерного структурированного массива на месте по одному или нескольким полям, возможно, нечисловых типов, которые могут независимо изменять свое направление (Ascending/Descending). По сути, я ищу что-то вроде предложения SQL ORDER BY.
1 ответ
Как он сказал в своем ответе:
Это работает, предполагая, что все ваши значения являются числовыми (так как отрицательная не обратит сортировку строк)
То, что вы можете сделать, это преобразовать ваши данные в pandas DataFrame. Поскольку у вас уже есть данные в массивах NumPy, панды не будут копировать ваши данные, поэтому они будут повторно использовать ваши структуры данных, поэтому эта операция очень дешевая. После этого вы можете делать такие вещи, как:
>>> a = np.array([(4, 'GE'), (1,'RE'), (1,'AE'), (4,'CD')],
dtype=[('x', 'i4'), ('y', 'S2')])
>>> df = pd.DataFrame(a)
>>> df.sort(['x', 'y'], ascending=[0,1])
x y
3 4 CD
0 4 GE
2 1 AE
1 1 RE
>>> df.sort(['x', 'y'], ascending=[0,0])
x y
0 4 GE
3 4 CD
1 1 RE
2 1 AE
>>> df.sort(['y', 'x'], ascending=[1,0])
x y
2 1 AE
3 4 CD
0 4 GE
1 1 RE
>>> df.sort(['y', 'x'], ascending=[0,0])
x y
1 1 RE
0 4 GE
3 4 CD
2 1 AE