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

不使用pandas sort方法对指定结尾的DataFrame序列排序

解决方案:不使用pandas sort方法的DataFrame链式排序

核心思路

观察数据可知,IN和OUT存在链式关联:排序后某一行的OUT值等于下一行的IN值,且最后一行固定为IN=5816993, OUT=0。基于这个规律,我们可以从已知的最后一行反向遍历,通过映射关系构建完整的排序序列,全程不需要调用pandas的sort方法。

具体实现步骤

  1. 构建快速映射字典:将原DataFrame中每行的OUT值作为key,对应的整行数据作为value,这样可以快速通过IN值找到上一行数据。
  2. 反向构建序列:从固定的最后一行(OUT=0)开始,循环查找前一行(即OUT等于当前行IN的行),直到遍历完整个链条。
  3. 反转得到正序:将反向构建的序列反转,得到符合要求的正序结果。

代码示例(针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:30:59