如何使用Pandas或read_lookup()对比两个大型数据集判定元素关联关系
实现方案
这个需求用pandas DataFrame或者Python原生方法都可以完成,不存在技术障碍。你提到的read_lookup()并不是pandas的内置方法,旧版pandas存在的DataFrame.lookup()方法已经在2.0+版本正式移除,不建议使用。下面给出两种可直接运行的实现:
方案1:Pandas实现(推荐,适合后续需要做额外数据统计的场景)
核心思路是先把第二个文件的BGP关系表加载成(AS1, AS2)为键、关系值为值的映射字典,再遍历第一个文件的AS对,按规则匹配分类即可。
import pandas as pd # 加载BGP关系映射表,AS号统一用字符串存储避免长ASN精度丢失 rel_df = pd.read_csv( "你的第二个txt文件路径", sep="|", header=None, names=["asn1", "asn2", "rel", "proto"], dtype={"asn1": str, "asn2": str, "rel": int} ) rel_map = {(r.asn1, r.asn2): r.rel for r in rel_df.itertuples(index=False)} # 加载待判定的AS对 pair_df = pd.read_csv( "你的第一个txt文件路径", sep="|", header=None, names=["a", "b"], dtype={"a": str, "b": str} ) # 按规则判定每对AS的关系 def match_rel(row): a, b = row["a"], row["b"] ab_val = rel_map.get((a, b)) ba_val = rel_map.get((b, a)) if ab_val == 0 or ba_val == 0: return (0, 0, 1, 0) if ab_val == -1: return (1, 0, 0, 0) if ba_val == -1: return (0, 1, 0, 0) return (0, 0, 0, 1) pair_df[["customer", "provider", "peers", "NA"]] = pair_df.apply( lambda x: pd.Series(match_rel(x)), axis=1 ) # 按要求格式导出结果 pair_df[["customer", "provider", "peers", "NA"]].to_csv("result.csv", index=False)
注意:如果你的AS号长度不超过10位,也可以用整数类型存储,字符串类型是最稳妥的兼容方案
方案2:Python原生实现(无第三方依赖,运行速度更快)
如果不需要做后续的数据分析,直接用Python内置的文件操作和字典就能实现,逻辑和pandas版本一致,内存占用更低运行更快:
# 加载BGP关系映射 rel_map = {} with open("你的第二个txt文件路径", "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue asn1, asn2, rel, _ = line.split("|") rel_map[(asn1, asn2)] = int(rel) # 逐行判定AS对并写入结果 with open("你的第一个txt文件路径", "r", encoding="utf-8") as f_in, \ open("native_result.csv", "w", encoding="utf-8") as f_out: f_out.write("customer,provider,peers,NA\n") for line in f_in: line = line.strip() if not line: continue a, b = line.split("|") ab_val = rel_map.get((a, b)) ba_val = rel_map.get((b, a)) if ab_val == 0 or ba_val == 0: f_out.write("0,0,1,0\n") elif ab_val == -1: f_out.write("1,0,0,0\n") elif ba_val == -1: f_out.write("0,1,0,0\n") else: f_out.write("0,0,0,1\n")
关于lookup类方法的说明
pandas生态中不存在名为read_lookup()的公开方法,旧版pandas自带的DataFrame.lookup()方法因为性能差、功能可被更简单的映射替代,已经在pandas 2.0版本正式删除,上面代码用字典做映射的方式,比lookup方法运行效率高3~10倍,也不存在版本兼容问题,完全可以替代。
内容的提问来源于stack exchange,提问作者Ebone22
相关产品推荐
相关产品推荐

