Pandas如何使用节点DataFrame过滤两端均有效的边DataFrame
Pandas基于节点表过滤边表的实现方案
需求背景
现有两个Pandas DataFrame:
- 存储节点数据的
nodes表 - 存储边数据的
edges表
按照业务逻辑,所有边的两个端点都应当对应nodes表中已存在的节点,需要过滤掉存在非法端点的边记录。
数据样例
edges表
每行存储包含2个字符串的列表,分别对应边的两个端点,样例如下:
edges 11 ["INET_N_752", "INET_N_1730"] 253 ["SEQ_5753__L_LMGN", "SEQ_5369__S_LMGN"] 254 ["N_211_L_LMGN", "SEQ_5753__L_LMGN"] 277 ["SEQ_5753__L_LMGN", "SEQ_867_p"] 278 ["SEQ_867_p", "SEQ_871_p"] 279 ["SEQ_871_p", "SEQ_5789__L_LMGN"]
nodes表
每行存储仅包含1个字符串的列表,对应节点的唯一标识,样例如下:
nodes 15 ["INET_N_752"] 16 ["INET_N_1730"] 196 ["SEQ_5753__L_LMGN"] 197 ["SEQ_5369__S_LMGN"] 198 ["N_211_L_LMGN"] 222 ["SEQ_867_p"]
过滤规则
仅保留边的两个端点均存在于nodes表中的记录,例如edges表中索引为11的记录两个端点都在nodes表中,属于需要保留的合法记录。
验证可行的实现代码
edges[(edges.apply(lambda x: x[0]).isin(nodes.apply(lambda x: x[0])) & edges.apply(lambda x: x[1]).isin(nodes.apply(lambda x: x[0])))]
代码逻辑说明
- 用
nodes.apply(lambda x: x[0])提取nodes表中所有节点ID,生成合法节点的匹配集合 - 分别提取edges表每行的第一个端点
edges.apply(lambda x: x[0])和第二个端点edges.apply(lambda x: x[1]) - 通过
isin()方法判断两个端点是否都属于合法节点集合,两个条件同时满足的边记录会被保留
内容的提问来源于stack exchange,提问作者oakca
相关产品推荐
相关产品推荐

