Можно ли сортировать по нескольким полям в массивном структурированном массиве с некоторым обратным, как 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
Другие вопросы по тегам