You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据自定义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)

输出效果

两种方法得到的结果都符合预期:

IDtitlerating
103Monitor2
101TV1
102AC2
104Headphone3
105Laptop2

如果需要调整未匹配ID的排序规则,比如按评分降序排列,只需要在sort_values的by参数中追加对应字段即可。

内容的提问来源于stack exchange,提问作者Mahipal Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:15:01