不使用pandas sort方法对指定结尾的DataFrame序列排序
解决方案:不使用pandas sort方法的DataFrame链式排序
核心思路
观察数据可知,IN和OUT存在链式关联:排序后某一行的OUT值等于下一行的IN值,且最后一行固定为IN=5816993, OUT=0。基于这个规律,我们可以从已知的最后一行反向遍历,通过映射关系构建完整的排序序列,全程不需要调用pandas的sort方法。
具体实现步骤
- 构建快速映射字典:将原DataFrame中每行的
OUT值作为key,对应的整行数据作为value,这样可以快速通过IN值找到上一行数据。 - 反向构建序列:从固定的最后一行(
OUT=0)开始,循环查找前一行(即OUT等于当前行IN的行),直到遍历完整个链条。 - 反转得到正序:将反向构建的序列反转,得到符合要求的正序结果。
代码示例(针对df_1)
import pandas as pd # 初始化df_1 df_1 = pd.DataFrame() df_1['IN'] = [5797067,5801307,5801615,5802487,5802839,5803163,5803579,5804175,5804947,5805287,5805559,5816775,5816957,5816993,5817055] df_1['OUT'] = [5801307, 5801615, 5802487, 5802839, 5803163, 5803579,5804175, 5804947, 5805559, 5816775, 5805287, 5817055, 5816993,0,5816957] # 构建OUT到行数据的映射字典 out_to_row = {} for _, row in df_1.iterrows(): out_to_row[row['OUT']] = {'IN': row['IN'], 'OUT': row['OUT']} # 反向构建排序序列 sorted_rows = [out_to_row[0]] # 先加入固定的最后一行 current_in = sorted_rows[-1]['IN'] while current_in in out_to_row: prev_row = out_to_row[current_in] sorted_rows.append(prev_row) current_in = prev_row['IN'] # 反转得到正序 sorted_rows.reverse() # 转换为排序后的DataFrame df_sorted = pd.DataFrame(sorted_rows) print(df_sorted)
适配多个DataFrame
这个逻辑可直接复用在另外两个DataFrame上:
- 仅需替换代码中的
df_1为目标DataFrame。 - 确保目标DataFrame中存在且仅存在一行
OUT=0的记录(即固定的最后一行)。
注意事项
如果DataFrame中存在多个行的OUT值相同,需根据业务逻辑添加额外筛选规则(比如指定优先级),但从给出的df_1数据来看,所有OUT值都是唯一的,当前代码可直接运行。
内容的提问来源于stack exchange,提问作者Klaus_84
相关产品推荐
相关产品推荐

