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

Python3如何过滤双列DataFrame去除CrossroadID保留起止PlaceID关联

实现方案

你可以用Pandas搭配NetworkX图计算库实现需求,逻辑简单,同时支持连续多段Crossroad节点的自动合并,无需额外适配。

首先安装依赖库:

pip install pandas networkx

参考代码如下:

import pandas as pd
import networkx as nx

# 读取原始数据,也可以直接用注释里的示例数据测试
df = pd.read_csv("你的数据文件路径.csv")
# 示例数据构造,直接运行可验证效果
# df = pd.DataFrame([
#     ["PlaceID1", "CrossroadID3"],
#     ["PlaceID2", "CrossroadID3"],
#     ["CrossroadID3", "PlaceID4"],
#     ["PlaceID4", "PlaceID5"],
#     ["PlaceID4", "PlaceID6"],
#     ["PlaceID6", "PlaceID7"],
# ], columns=["Source", "Target"])

# 构建有向图
g = nx.from_pandas_edgelist(df, source="Source", target="Target", create_using=nx.DiGraph)

# 筛选所有需要剔除的Crossroad类型节点,可根据你的实际命名规则调整判断条件
remove_nodes = [node for node in g.nodes if node.startswith("Crossroad")]

# 遍历待移除节点,拼接前后链路
for node in remove_nodes:
    # 获取当前节点的所有前驱(指向该节点的上游节点)
    pre_nodes = list(g.predecessors(node))
    # 获取当前节点的所有后继(该节点指向的下游节点)
    suc_nodes = list(g.successors(node))
    # 添加上游到下游的直接链路
    for pre in pre_nodes:
        for suc in suc_nodes:
            g.add_edge(pre, suc)
    # 删除Crossroad节点
    g.remove_node(node)

# 转换为DataFrame导出结果
result_df = nx.to_pandas_edgelist(g, source="Source", target="Target")
# 可选:排序+去重
result_df = result_df.sort_values(["Source", "Target"]).drop_duplicates().reset_index(drop=True)

print(result_df)
# 导出为csv文件
# result_df.to_csv("处理结果.csv", index=False)

运行上述代码得到的结果和你期望的输出完全一致。如果后续有多个连续的Crossroad节点(比如PlaceA→Cross1→Cross2→PlaceB),该方案也会自动合并为PlaceA→PlaceB的链路,无需修改代码。

内容的提问来源于stack exchange,提问作者MajorAlan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:36:03