根据列表重新排列pandas数据帧的行并保持顺序

时间:2016-10-12 07:08:36

标签: pandas numpy

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.在三组中的每一组中,初始排序应保持不变。

在开始时,df排列如下:

   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

2 个答案:

答案 0 :(得分:5)

你可以使用argsortkind='mergesort'来获得保持顺序的排序行索引,然后简单地将数据框索引到所需输出的数据框中,如下所示 -

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

示例运行 -

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

答案 1 :(得分:2)

纯pandas

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)