按(索引)数字列表对 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 且没有重复项。
我有一个包含 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 且没有重复项。