按(索引)编号列表对数据帧行进行排序

2024-06-07 22:27:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有229行的熊猫数据帧。我有一个索引号列表([47, 16, 59, ...]),我想按照这个顺序重新排序数据帧中的行

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

我确信有很多方法可以合并一堆表并删除列,但是。。。有没有一种很好的惯用方法


Tags: 数据方法true过滤器df列表gethierarchy
2条回答

如果列表的形状与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

注意,NONE和缺少的行是由于索引和数据帧索引不匹配造成的。我没有花时间确保索引有1-99个,并且没有重复

相关问题 更多 >

    热门问题