如何基于循环模式筛选DataFrame?该需求是否可实现?
筛选DataFrame中的循环模式行是否可行?
完全可以实现。从你的示例来看,这里的“循环模式”可以定义为:行所在的连通分支中存在闭合环,排除孤立节点或无法形成任何闭环的分支对应的行(比如k→g、r→w这类,要么节点无其他关联,要么无法形成闭环)。
实现思路
把col1看作有向图的起点,col2看作终点,将DataFrame转化为有向图后,通过**强连通分量(SCC)**识别循环结构:
- 强连通分量指分量内任意两个节点互相可达,天然对应闭合循环。
- 保留那些属于包含强连通分量的连通分支的行,排除孤立或无闭环的分支。
具体代码实现
使用networkx库处理图结构(未安装可执行pip install networkx):
import pandas as pd import networkx as nx # 构建原始DataFrame df = pd.DataFrame({ 'col1': ['a', 'b', 'c', 'd', 'k', 'w', 'y', 'z', 'r'], 'col2': ['b', 'c', 'd', 'a', 'g', 'x', 'z', 'w', 'w'], 'col3': [1, 2, 3, 4, 5, 6, 7, 8, 9] }) # 构建有向图 G = nx.DiGraph() G.add_edges_from(df[['col1', 'col2']].values) # 筛选出存在循环的强连通分量(大小≥2) sccs = [scc for scc in nx.strongly_connected_components(G) if len(scc) >= 2] scc_nodes = set().union(*sccs) # 收集所有与循环分量相关的节点(包括能到达/被循环分量到达的节点) related_nodes = set(scc_nodes) for node in scc_nodes: related_nodes.update(nx.descendants(G, node)) related_nodes.update(nx.ancestors(G, node)) # 筛选符合条件的行 filtered_df = df[df['col1'].isin(related_nodes)] print(filtered_df)
运行后输出与你的预期一致:
col1 col2 col3 0 a b 1 1 b c 2 2 c d 3 3 d a 4 5 w x 6 6 y z 7 7 z w 8
说明
- 代码先识别出
{a,b,c,d}这个完整闭环,再找出所有与循环分支相关的节点(比如w、z、y、x),从而保留对应的行。 - 如果需要更严格的循环定义(仅保留完整闭环内的行),可调整筛选条件为
df[(df['col1'].isin(scc_nodes)) & (df['col2'].isin(scc_nodes))]。
内容的提问来源于stack exchange,提问作者Nico Rafael
相关产品推荐
相关产品推荐

