代码之家  ›  专栏  ›  技术社区  ›  sectechguy

PANDAS两个数据帧在CIDR中查找IP并映射INCIDR列

  •  1
  • sectechguy  · 技术社区  · 6 年前

    我有两个数据帧。一个(df1),带有CIDR和一个列,该列将始终是用于丰富第二个数据帧的列。另一个数据帧(DF2)有一个IP列表。我想通过DF1中的CIDR迭代IP,如果它在一个中,则标记DF2。我已经通读了图书馆的文件 ipaddress netaddr 并且在过去使用过这两个库,但在这种情况下,我很难确定如何使用它们。

    如果得到CIDR 13.64.0.0/11的范围,将得到13-64.0.0-13.95.255.255。13.64.1.100属于该范围

    数据帧:

    df1
        CIDR           inCIDR
    0   13.64.0.0/11   1
    1   13.96.0.0/13   1
    2   13.104.0.0/14  1
    3   20.34.0.0/15   1
    4   20.36.0.0/14   1
    5   20.40.0.0/13   1
    6   20.128.0.0/16  1
    7   20.140.0.0/15  1
    8   20.144.0.0/14  1
    9   20.160.0.0/12  1
    10  20.176.0.0/14  1
    11  20.180.0.0/14  1
    12  20.184.0.0/13  1
    13  23.96.0.0/13   1
    14  40.64.0.0/10   1
    15  42.159.0.0/16  1
    
    df2
        ipaddress
    0   18.235.100.252   
    1   13.64.1.100 
    2   40.64.11.22  
    3   184.84.243.59   
    4   184.84.243.119  
    5   20.180.22.12  
    6   3.17.7.58  
    7   34.233.202.21  
    8   42.159.10.10 
    

    期望输出:

    df2
        ipaddress        inCIDR
    0   18.235.100.252   0  
    1   13.64.1.100      1
    2   40.64.11.22      1
    3   184.84.243.59    0
    4   184.84.243.119   0
    5   20.180.22.12     1
    6   3.17.7.58        0
    7   34.233.202.21    0 
    8   42.159.10.10     1
    

    可能使用map来分配incidr,例如:

    df2['inCIDR'] = df2['ipaddress'].map(df1.set_index('ipaddress')['inCIDR']).fillna(0).astype(int)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Vaishali    6 年前

    如果需要根据IP地址中的前两个值映射值

    new_df = df1.copy()
    new_df['CIDR'] = new_df['CIDR'].str.extract('(\d+.\d+).')
    
    df2['inCIDR'] = df2['ipaddress'].str.extract('(\d+.\d+).')[0].map(new_df.set_index('CIDR')['inCIDR']).fillna(0).astype(int)
    
        ipaddress       inCIDR
    0   18.235.100.252  0
    1   13.64.1.100     1
    2   40.64.11.22     1
    3   184.84.243.59   0
    4   184.84.243.119  0
    5   20.180.22.12    1
    6   3.17.7.58       0
    7   34.233.202.21   0
    8   42.159.10.10    1