Сортировать pandas строк DataFrame по списку (индексных) чисел - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть pandas DataFrame с 229 строками. У меня есть список номеров индексов ([47, 16, 59, ...]), и я хочу повторно отсортировать строки моего DataFrame в этом порядке.

Подробности: я пропустил DF через фильтр (в частности, scipy) .cluster.hierarchy.dendrogram , настройка get_leaves=True). Возвращаемое значение включает в себя список номеров индексов (leaves) в порядке листовых узлов дендрограммы. Теперь я хочу отсортировать свою DF в таком порядке, чтобы я мог строить кластеры.

Я уверен, что есть много способов объединить несколько таблиц и удалить столбцы, но ... есть хороший идиоматизм c способ сделать это?

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Создание нового столбца, сопоставление ваших индексов с правильными строками и затем выполнение сортировки должно быть самым простым способом сделать это.

Я создал несколько фиктивных данных, чтобы привести пример;

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

df
     A   B   C   D
0    8  27   2   9
1   87  17  82  61
2   20  65  42  87
3    6  60  99  22
4    1  54  57  32

indices = [random.randrange(99) for i in range(99)]
#[54, 37, 83, 25, 44, 68, 81, 72, 61, 74, 10, 75, 24, 77, 89, 6, 59, 95, 44, 20, 72, 0, 53, 6, 61, 17, 52, 7, 95, 4, 64, 15, 46, 18, 58, 30, 3, 7, 94, 30, 93, 78, 24, 98, 65, 63, 79, 1, 43, 17, 76, 65, 85, 88, 66, 86, 10, 96, 27, 85, 66, 48, 2, 83, 25, 11, 88, 41, 88, 10, 15, 19, 75, 6, 72, 39, 28, 18, 78, 22, 71, 28, 97, 76, 47, 38, 9, 91, 69, 27, 63, 43, 19, 38, 80, 16, 35, 20, 65]

Код:

df['NewIndex'] = None # Create new column, with only None values

for indx, value in enumerate(indices):
    df['NewIndex'][value] = indx # Set index (List element number) to indx (Order in indices list)

df = df.sort_values(by=['NewIndex']) # Sort by new column

Вывод:

         A   B   C   D NewIndex
54  69  73  81  31        0
37  54  97  45  31        1
68  27  56  86  50        5
81  60   8  20  29        6
74  95  54  45  59        9
..  ..  ..  ..  ..      ...
84   9  67  88  38     None
87  47   9  97   2     None
90  38   6  98  50     None
92  57  51  84  37     None
99  12  88  38  90     None

Обратите внимание, что ноны и пропущенные строки будут вызваны несоответствиями в индексах и индексах фрейма данных. Я не потратил время на то, чтобы индексы имели 1-99 и не имели дубликатов.

1 голос
/ 03 февраля 2020

, если список имеет ту же форму, что и df, просто вставьте его в таком виде и отсортируйте по вновь созданному столбцу

df['List']=ListOfIndices
df.sort_values(by=['List'])
...