按(索引)数字列表对 pandas DataFrame 行进行排序

Sort pandas DataFrame rows by a list of (index) numbers

我有一个包含 229 行的 pandas DataFrame。我有一个索引号列表 ([47, 16, 59, ...]),我想将我的 DataFrame 的行重新排序为这个顺序。

详情:我运行 DF通过一个过滤器(具体来说,scipy.cluster.hierarchy.dendrogram,设置get_leaves=True)。 return 值包括按树状图叶节点顺序排列的索引号列表 (leaves)。我现在想按该顺序对我的 DF 进行排序,以便我可以绘制集群。

我确信有很多方法可以合并一堆表并删除列,但是...有没有一种很好的惯用方法来做到这一点?

如果列表与 df 的形状相同,则只需将其粘贴进去并按新创建的列排序

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

创建一个新列,将索引映射到正确的行,然后执行排序应该是最简单的方法。

我创建了一些虚拟数据来提供示例;

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 且没有重复项。