如何根据自定义ID列表对Pandas DataFrame排序,解决df.loc局限性问题
Pandas 按部分自定义ID列表排序的实现方法
你之前使用df.loc的问题是该方法仅会返回自定义列表中存在的ID对应行,会丢弃其余未匹配的ID数据。你可以通过以下两种方法实现「先按自定义顺序排列匹配ID,其余ID自动排在后面」的需求:
方法1:构造排序键(推荐,适合大数据量场景)
通过给ID绑定排序优先级的方式实现,无需遍历全量ID:
import pandas as pd ratings_dict = { "ID": ["101", "102", "103", "104", "105"], "title": ['TV', 'AC', 'Monitor', 'Headphone', 'Laptop'], "rating": [1, 2, 2, 3, 2] } df = pd.DataFrame(ratings_dict) trend_sort=["103","101"] # 构造ID对应的排序优先级字典,越靠前的ID优先级数值越小 sort_priority = {id_val: idx for idx, id_val in enumerate(trend_sort)} # 生成排序键,未匹配到的ID对应值为NaN,排序时默认排在末尾 df_sorted = df.sort_values( by=df['ID'].map(sort_priority), na_position='last' ).set_index('ID')
方法2:拼接全量排序顺序(适合小数据量场景,逻辑更直观)
直接构造完整的排序索引列表后重排:
import pandas as pd ratings_dict = { "ID": ["101", "102", "103", "104", "105"], "title": ['TV', 'AC', 'Monitor', 'Headphone', 'Laptop'], "rating": [1, 2, 2, 3, 2] } df = pd.DataFrame(ratings_dict) trend_sort=["103","101"] df = df.set_index('ID') # 自定义ID放前面,剩余ID按原有顺序拼接在后面 full_sort_order = trend_sort + [id for id in df.index if id not in trend_sort] df_sorted = df.reindex(full_sort_order)
输出效果
两种方法得到的结果都符合预期:
| ID | title | rating |
|---|---|---|
| 103 | Monitor | 2 |
| 101 | TV | 1 |
| 102 | AC | 2 |
| 104 | Headphone | 3 |
| 105 | Laptop | 2 |
如果需要调整未匹配ID的排序规则,比如按评分降序排列,只需要在sort_values的by参数中追加对应字段即可。
内容的提问来源于stack exchange,提问作者Mahipal Singh
相关产品推荐
相关产品推荐

