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
相关产品推荐
相关产品推荐

