按(索引)编号列表对PandasDataFrame行进行排序

z2acfund  于 2022-11-20  发布在  其他
关注(0)|答案(3)|浏览(190)

我有一个有229行的Pandas数据框。我有一个索引号列表([47, 16, 59, ...]),我想按照这个顺序重新排序数据框的行。
详细信息:我通过一个过滤器运行了DF(具体来说,scipy.cluster.hierarchy.dendrogram,设置get_leaves=True)。返回值包括一个索引号列表(leaves),按树状图叶节点的顺序排列。现在我想按该顺序对DF进行排序,以便绘制聚类。
我相信有很多方法可以合并一堆表并删除列,但是......有没有一种很好的惯用方法可以做到这一点?

kse8i1jr

kse8i1jr1#

创建一个新列,将索引Map到正确的行,然后执行排序应该是最简单的方法。
我创建了一些虚拟数据以提供一个示例;

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

注意,空和缺少的行将是由于索引和 Dataframe 索引不匹配。我没有花时间来确保索引有1-99和没有重复。

e0uiprwp

e0uiprwp2#

如果列表的形状与df相同,那么就像这样粘贴它,并按新创建的列排序

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

sy5wg1nm3#

df.loc[ListOfIndices]

如果要重置索引:

df.loc[ListOfIndices].reset_index(drop=True)

相关问题