如何按照另一DataFrame的行顺序对目标DataFrame进行排序?
解决DataFrame行顺序匹配问题
错误原因
你用sort_values(by=eval_df['id'])报错是因为sort_values的by参数只接受列名字符串/列名列表,而你传入的是一整列Series,程序无法识别对应的列,因此触发KeyError。
正确解决方法
以下是三种可靠的实现方式,可根据你的数据情况选择:
方法1:reindex(适用于id完全匹配、无重复的场景)
通过设置id为索引,再按目标顺序重新索引:
# 将uneval_df的id设为索引 uneval_df = uneval_df.set_index('id') # 按照eval_df的id顺序重新排列,最后恢复原索引结构 uneval_df = uneval_df.reindex(eval_df['id']).reset_index(drop=False)
方法2:分类排序(适用于可能存在id不匹配的场景)
把id转为分类类型并指定顺序,再排序:
import pandas as pd # 将uneval_df的id转为分类,强制指定顺序为eval_df的id序列 uneval_df['id'] = pd.Categorical(uneval_df['id'], categories=eval_df['id'], ordered=True) # 按id列排序,自动遵循指定的顺序 uneval_df = uneval_df.sort_values('id')
方法3:左连接合并(适用于需要保留eval_df所有行的场景)
利用merge的左连接特性,自动保留左表(eval_df)的行顺序:
# 仅用eval_df的id列做左连接,匹配uneval_df的所有对应列 uneval_df = eval_df[['id']].merge(uneval_df, on='id', how='left')
内容的提问来源于stack exchange,提问作者Rashid Abramov
相关产品推荐
相关产品推荐

