如何按指定RackID排列顺序对Pandas DataFrame进行排序?
Pandas按指定RackID顺序重新排序DataFrame
问题描述
我拥有如下结构的Pandas DataFrame:
| RunID | RackID | PartID | HandID | Ultra | |
|---|---|---|---|---|---|
| 0 | 1 | 6 | 61 | 4 | 24 |
| 1 | 2 | 2 | 59 | 11 | 33 |
| 2 | 3 | 1 | 37 | 18 | 17 |
| 3 | 4 | 4 | 28 | 112 | 55 |
| 4 | 5 | 3 | 45 | 31 | 246 |
| 5 | 6 | 5 | 73 | 29 | 26 |
希望按照RackID的指定排列顺序对该DataFrame重新排序,预期结果如下:
| RunID | RackID | PartID | HandID | Ultra | |
|---|---|---|---|---|---|
| 4 | 5 | 3 | 45 | 31 | 246 |
| 3 | 4 | 4 | 28 | 112 | 55 |
| 1 | 2 | 2 | 59 | 11 | 33 |
| 2 | 3 | 1 | 37 | 18 | 17 |
| 0 | 1 | 6 | 61 | 4 | 24 |
| 5 | 6 | 5 | 73 | 29 | 26 |
我曾尝试使用reindex和iloc方法,但未得到预期结果,请问如何在Pandas中实现这一需求?
解决方案
首先明确你需要的RackID自定义顺序为 [3,4,2,1,6,5],以下两种方法可以实现需求:
方法一:使用pd.Categorical指定排序规则
将RackID列转换为分类类型,明确指定自定义排序顺序,再通过sort_values完成排序,该方法会保留原始索引,且严格遵循指定顺序:
import pandas as pd # 构造原始DataFrame data = { 'RunID': [1, 2, 3, 4, 5, 6], 'RackID': [6, 2, 1, 4, 3, 5], 'PartID': [61, 59, 37, 28, 45, 73], 'HandID': [4, 11, 18, 112, 31, 29], 'Ultra': [24, 33, 17, 55, 246, 26] } df = pd.DataFrame(data) # 定义RackID的自定义排序顺序 custom_rack_order = [3, 4, 2, 1, 6, 5] # 将RackID转为分类类型,设置有序规则 df['RackID'] = pd.Categorical(df['RackID'], categories=custom_rack_order, ordered=True) # 按RackID排序 sorted_df = df.sort_values('RackID') print(sorted_df)
方法二:通过映射生成排序键实现排序
创建一个映射字典,将每个RackID对应到其在自定义顺序中的位置,生成临时排序键列后完成排序,适合不想修改原列类型的场景:
import pandas as pd # 构造原始DataFrame data = { 'RunID': [1, 2, 3, 4, 5, 6], 'RackID': [6, 2, 1, 4, 3, 5], 'PartID': [61, 59, 37, 28, 45, 73], 'HandID': [4, 11, 18, 112, 31, 29], 'Ultra': [24, 33, 17, 55, 246, 26] } df = pd.DataFrame(data) # 定义RackID的自定义排序顺序 custom_rack_order = [3, 4, 2, 1, 6, 5] # 创建RackID到排序位置的映射 order_map = {rack_id: idx for idx, rack_id in enumerate(custom_rack_order)} # 添加临时排序键列 df['sort_key'] = df['RackID'].map(order_map) # 按排序键排序后删除临时列 sorted_df = df.sort_values('sort_key').drop('sort_key', axis=1) print(sorted_df)
内容的提问来源于stack exchange,提问作者fuguang chen
相关产品推荐
相关产品推荐

