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

如何按指定ID列表顺序从Pandas DataFrame中筛选行?

按目标ID列表顺序筛选DataFrame行的解决方案

要实现按目标ID列表[3,9,6,4]的顺序展示筛选结果,以下两种方法都可以解决问题:

方法1:利用分类数据类型指定排序顺序

通过将目标ID设置为分类类型并指定固定顺序,再对筛选后的结果排序,就能得到符合要求的输出:

import pandas as pd

IDlist_df=pd.DataFrame({"v":[3,9,6,4]})
df=pd.DataFrame({"ID":[1,1,2,3,3,4,4,4,5,6,6,7,8,9],"name":['menelaus','helen','ulyses','paris','hector', 'priamus','hecuba','andromache','achiles','ascanius','eneas','ajax','nestor','helenus']})

# 提取目标ID列表
target_ids = IDlist_df['v'].tolist()

# 筛选符合条件的行
selected_lines = df[df['ID'].isin(target_ids)].copy()

# 将ID列转为分类类型,绑定目标顺序
selected_lines['ID'] = pd.Categorical(selected_lines['ID'], categories=target_ids, ordered=True)

# 按ID排序
selected_lines = selected_lines.sort_values('ID')

print(selected_lines)

运行后输出结果会和你期望的一致,且保留原DataFrame的索引。

方法2:利用merge左连接保留顺序

利用pandas的merge左连接特性,左表(存储目标ID的DataFrame)的顺序会被完整保留,合并后即可得到对应顺序的结果:

import pandas as pd

IDlist_df=pd.DataFrame({"v":[3,9,6,4]})
df=pd.DataFrame({"ID":[1,1,2,3,3,4,4,4,5,6,6,7,8,9],"name":['menelaus','helen','ulyses','paris','hector', 'priamus','hecuba','andromache','achiles','ascanius','eneas','ajax','nestor','helenus']})

# 左连接,保留IDlist_df的顺序
result = IDlist_df.merge(df, left_on='v', right_on='ID', how='left').drop('v', axis=1)

print(result)

注意:这种方法默认会丢失原DataFrame的索引,如果需要保留原索引,可以先给df添加索引列,合并后再恢复:

df_with_idx = df.reset_index().rename(columns={'index': 'original_index'})
result = IDlist_df.merge(df_with_idx, left_on='v', right_on='ID', how='left').drop('v', axis=1)
# 若需要每个ID组内按原索引排序,可追加排序逻辑
result = result.sort_values(['ID', 'original_index'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:40:26