基于Pandas列内容添加反向链路信息列的高效实现方法
基于Pandas列内容添加反向链路信息列的高效实现方法
嘿,针对你这个给Pandas数据框添加反向链路信息的需求,我来分享一个更高效、更Pythonic的实现思路,比你现在的双重循环方法要简洁不少,而且性能更好~
首先先明确下需求:我们要为每条lXno对应的链路,找到反向链路(也就是当atNode等于当前行的lXno,且该行的某条lYno等于当前行的atNode时)的lYln值,把它放到新的lXop列里。
原始方法的小问题
你现在的双重循环+多次set_index的方法虽然能跑,但数据量大的时候会比较慢,而且频繁的索引操作也会带来不必要的内存开销。我们可以换个思路:先把所有的反向链路关系提前整理成一个映射表,之后直接查表赋值就行。
高效实现步骤
1. 构建反向链路映射字典
我们先遍历一遍数据,把所有存在的链路的反向关系存到字典里。键是(目标节点, 源节点)(也就是反向链路的两个节点),值是对应的ln值,如果有重复的反向关系,我们和你一样取最大值来保留:
import pandas as pd # 假设你的数据框已经加载为df reverse_link_map = {} for _, row in df.iterrows(): current_at_node = row['atNode'] # 遍历6条链路 for link_num in range(1, 7): lno_col = f'l{link_num}no' lln_col = f'l{link_num}ln' target_node = row[lno_col] ln_value = row[lln_col] # 跳过无链路的情况(lno为0) if target_node != 0: # 反向链路的键是 (target_node, current_at_node) map_key = (target_node, current_at_node) # 如果键已存在,取最大的ln值;否则直接存入 if map_key in reverse_link_map: reverse_link_map[map_key] = max(reverse_link_map[map_key], ln_value) else: reverse_link_map[map_key] = ln_value
2. 批量生成反向链路列
有了映射字典之后,我们就可以给每个lXop列批量赋值了,一行代码搞定一个列:
for link_num in range(1, 7): lno_col = f'l{link_num}no' op_col = f'l{link_num}op' # 用当前行的(atNode, lXno)去查映射,找不到就填0 df[op_col] = df.apply( lambda row: reverse_link_map.get((row['atNode'], row[lno_col]), 0), axis=1 )
为啥这个方法更好?
- 效率更高:只需要遍历数据两次(一次构建映射,一次赋值),避免了双重循环里的多次索引操作,数据量大的时候速度提升会很明显。
- 逻辑更清晰:把链路关系的整理和列赋值分开,代码可读性更强,也更容易维护。
- 内存开销小:不需要频繁创建临时的索引数据框,节省内存。
拿你给出的示例数据测试的话,第一行的l1op会拿到2(对应行66的反向链路),l2op会拿到1(对应行13的反向链路),完全符合你的预期~
备注:内容来源于stack exchange,提问作者svn
相关产品推荐
相关产品推荐

