2016-10-12 2 views
4
import numpy as np 
import pandas as pd 

df = pd.DataFrame(data={'result':[-6.77,6.11,5.67,-7.679,-0.0930,4.342]}\ 
,index=['A','B','C','D','E','F']) 
new_order = np.array([1,2,2,0,1,0]) 

new_order NumPy массив присваивает каждую строку к одной из трех групп [0,1 или 2]. Я хотел бы изменить строки df так, чтобы сначала отображались строки в группе 0, а затем 1 и, наконец, 2. В каждой из трех групп начальное упорядочение должно оставаться неизменным.Перестановка строка панд dataframe на основе списка и поддержания порядка

В начале ФР организован следующим образом:

result 
A -6.770 
B 6.110 
C 5.670 
D -7.679 
E -0.093 
F 4.342 

Здесь желаемый результат с учетом выше входной данные.

result 
D -7.679 
F 4.342 
A -6.770 
E -0.093 
B 6.110 
C 5.670 

ответ

4

Вы можете использовать argsort с kind='mergesort', чтобы получить отсортированные индексы строк, которые хранят порядок, а затем просто индекс в dataframe с теми, для желаемого выхода, как так -

df.iloc[new_order.argsort(kind='mergesort')] 

Sample перспектива -

In [2]: df 
Out[2]: 
    result 
A -6.770 
B 6.110 
C 5.670 
D -7.679 
E -0.093 
F 4.342 

In [3]: df.iloc[new_order.argsort(kind='mergesort')] 
Out[3]: 
    result 
D -7.679 
F 4.342 
A -6.770 
E -0.093 
B 6.110 
C 5.670 
2

чистые панды

df.set_index(new_order, append=True) \ 
    .sort_index(level=1) \ 
    .reset_index(1, drop=True) 

enter image description here

объяснение

  • добавить new_order к индексу
    • set_index(new_order, append=True)
  • использовать этот новый уровень индекса и сортировать по ним
    • sort_index(level=1)
  • падение уровня индекса я добавил
    • reset_index(1, drop=True)
+0

Не понимаю внутренние детали этого, но испытано и это работает! – Divakar

+0

@ Divakar надеюсь, что помогает – piRSquared

+0

Итак, что 'sort_index (level = 1)' part сортируется таким образом, который сохраняет порядок? – Divakar

Смежные вопросы