如何按指定序列排列Pandas DataFrame且保留原有索引?
问题分析
你当前代码的核心问题是:data.loc[sequenceList]是按索引值选取行,但sequenceList存储的是Flight列的数值,而非DataFrame默认的索引(0-5)。这不仅会导致行选取逻辑错误,还会直接将结果的索引替换为sequenceList中的数值,完全不符合你“按序列排列但保留原索引”的需求。
修正方案
以下两种方法都能实现按sequenceList的Flight值顺序排列DataFrame,同时保留原始索引:
方案一:通过Flight值映射原索引排序
import pandas as pd import numpy as np data = pd.DataFrame({ 'Flight':[1,2,3,4,5,6], 'Country':['Laos','US','UK','Aus','Sing','Malay'], }) sequenceList = np.random.permutation(data['Flight'].values.tolist()) # 建立Flight值到原索引的映射关系 flight_to_index = {flight: idx for idx, flight in data['Flight'].items()} # 将sequenceList转换为对应的原索引序列 target_indices = [flight_to_index[flight] for flight in sequenceList] # 按目标索引取行,保留原索引 sorted_data = data.loc[target_indices]
执行后sorted_data的行顺序完全匹配sequenceList的Flight值顺序,且每行的索引仍为原DataFrame的默认索引(0-5)。
方案二:利用辅助表指定排序顺序
import pandas as pd import numpy as np data = pd.DataFrame({ 'Flight':[1,2,3,4,5,6], 'Country':['Laos','US','UK','Aus','Sing','Malay'], }) sequenceList = np.random.permutation(data['Flight'].values.tolist()) # 创建带排序权重的辅助表 order_helper = pd.DataFrame({'Flight': sequenceList, 'sort_order': range(len(sequenceList))}) # 合并原数据与辅助表,按权重排序后恢复原索引 sorted_data = pd.merge(data.reset_index(), order_helper, on='Flight') \ .sort_values('sort_order') \ .set_index('index') \ .rename_axis(None) \ .drop('sort_order', axis=1)
这种方法通过给每个Flight值分配唯一的排序权重,合并后按权重排序,最后恢复原索引,逻辑更直观。
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

