如何按指定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
相关产品推荐
相关产品推荐

