You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:27:27