сортировать фрейм данных по другому фрейму данных - PullRequest
1 голос
/ 16 февраля 2020

Учитывая dn's knn_df

           0          1         2          3
0  1.1565523   1.902790  1.927971  1.1530536
1   1.927971  1.1565523  1.815097  1.1530536
2   1.902790  1.1565523  1.815097   1.927971
3   1.815097   1.927971  1.902790  1.1530536
4   1.902790  1.1565523  1.815097  1.1530536

date_df

    0   1   2   3
0   2011-11-14 02:30:00.601 2003-08-12 00:00:00.000 2003-11-30 23:00:00.000 2011-10-25 12:00:00.000
1   2003-11-30 23:00:00.000 2011-11-14 02:30:00.601 2002-08-06 00:00:00.000 2011-10-25 12:00:00.000
2   2003-08-12 00:00:00.000 2011-11-14 02:30:00.601 2002-08-06 00:00:00.000 2003-11-30 23:00:00.000
3   2002-08-06 00:00:00.000 2003-11-30 23:00:00.000 2003-08-12 00:00:00.000 2011-10-25 12:00:00.000
4   2003-08-12 00:00:00.000 2011-11-14 02:30:00.601 2002-08-06 00:00:00.000 2011-10-25 12:00:00.000

Я должен отсортировать значения knn_df по датам date_df.

Каждая строка в date_df соответствует строке в knn_df

Я пытался сортировать следующим образом.

np.argsort(dates_df.values,axis=1)[:,::-1]

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

, которые дают правильный порядок значений по столбцам, но когда я пытался изменить порядок

Sorted_knn = (knn_df.values[np.arange(len(knn_df)),
                        np.argsort(dates_df.values,axis=1)[:,::-1]])

Я получаю сообщение об ошибке

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (5,) (5,4) 

Я что-то упустил ...

1 Ответ

0 голосов
/ 16 февраля 2020

Добавить [:, None] для создания двумерного массива 5x1 для правильного вещания:

a = np.argsort(dates_df.values,axis=1)[:,::-1]
b = knn_df.values[np.arange(len(knn_df))[:, None], a]
print (b)
[[1.1565523 1.1530536 1.927971  1.90279  ]
 [1.1565523 1.1530536 1.927971  1.815097 ]
 [1.1565523 1.927971  1.90279   1.815097 ]
 [1.1530536 1.927971  1.90279   1.815097 ]
 [1.1565523 1.1530536 1.90279   1.815097 ]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...