能否按前一行的值对DataFrame排序?起止点列关联排序需求
嘿,这个链式排序的需求我熟!咱要实现的就是让DataFrame里的行形成「上一行Endpoint = 下一行Startpoint」的连续链条,下面给你一步步说怎么弄:
核心思路
首先得找到这条链的起始节点——也就是某个Startpoint的值,完全没出现在所有Endpoint的列表里(比如你示例里的Berlin,没有任何一行的Endpoint是它)。找到起始点后,我们就可以顺着链条依次匹配,把行按顺序串起来。
代码实现(Pandas版)
import pandas as pd # 先模拟你的原始DataFrame(这里故意打乱顺序来测试) df = pd.DataFrame({ 'Startpoint': ['Munich', 'Berlin', 'Barcelona', 'Paris'], 'Endpoint': ['Paris', 'Munich', 'Rom', 'Barcelona'] }) # 第一步:定位起始点——不在Endpoint列中的Startpoint start_point = df[~df['Startpoint'].isin(df['Endpoint'])]['Startpoint'].iloc[0] # 第二步:构建排序后的索引序列 sorted_indices = [] current_point = start_point # 循环遍历直到所有行都被加入链条 while len(sorted_indices) < len(df): # 找到当前起始点对应的行 current_row = df[df['Startpoint'] == current_point] # 记录该行的索引 sorted_indices.append(current_row.index[0]) # 更新当前点为该行的Endpoint,继续找下一行 current_point = current_row['Endpoint'].iloc[0] # 第三步:用索引重新排序DataFrame,重置索引让它更规整 sorted_df = df.loc[sorted_indices].reset_index(drop=True) # 看看结果 print(sorted_df)
运行后输出就是你想要的顺序:
Startpoint Endpoint 0 Berlin Munich 1 Munich Paris 2 Paris Barcelona 3 Barcelona Rom
额外提醒
- 如果你的数据里有多条独立的链条,这个方法需要调整——得先找出所有的起始点,再分别构建每条链后合并。
- 如果数据存在循环闭环(比如A→B,B→A),这个逻辑会陷入死循环,所以使用前要确保你的数据是无环的单向链式结构。
内容的提问来源于stack exchange,提问作者user5317046
相关产品推荐
相关产品推荐

