【问题标题】:Convert IP address to integer in Pandas在 Pandas 中将 IP 地址转换为整数
【发布时间】:2020-03-20 06:26:03
【问题描述】:

我有一个 Pandas 数据框,如下所示,我正在尝试将 IP 地址转换为整数。

    install Network subnet_bits Next    Hop AS1 AS2 AS3 AS4 
0   *   1.0.0.0 24.0    202.12.28.1 0   4777    13335   i   NaN NaN 
1   *   1.0.4.0 22.0    202.12.28.1 0   4777    6939    4826    38803   56203
2   *   1.0.4.0 24.0    202.12.28.1 0   4777    6939    4826    38803   56203   

我正在使用ipaddress 库。似乎该指数正在阻碍。我不知道如何轻松地将 UP 地址转换为整数。

这是我的代码:

try:
    network = int(ipaddress.IPv4Address(df['Network']))
    print(network)
except ValueError:
    print('address/netmask is invalid for IPv4:', df.Network)

这是错误信息:

address/netmask is invalid for IPv4: 

0             1.0.0.0
1             1.0.4.0
2             1.0.4.0

【问题讨论】:

  • * 属于哪一列?
  • 您希望int(ipaddress.IPv4Address(...)) 的结果是什么?一个IP地址是四个数字,你想怎么转换成一个数字?
  • @kaya3 IPv4 地址具有明确的表示为 32 位无符号整数。我想我们甚至可以说这是 IPv4 地址的原生格式!例如:en.wikipedia.org/wiki/IPv4#Addressing
  • @pabouk 不是很明确 - 它可以是大端或小端。此外,如果 OP 是这个意思,那么他们的问题需要这么说,因此我要求澄清。
  • @kaya3 IPv4 标头中的 32 位字段是 IP 地址的本机格式。 RFC datatracker.ietf.org/doc/html/rfc790 描述了位的顺序(您可以将其称为 32 位字段的字节顺序),还显示了对最常见的文本符号 - 点分十进制的转换。除了这种 IPv4 地址表示法之外,还有许多主要网络库和工具中实现的无点表示法(十进制的无符号整数 32 位)。试试这个:ping 2130706433 (2130706433 == 0x7f000001) 和ping 127.0.0.1一样

标签: python pandas integer ip-address


【解决方案1】:

我认为你的问题是ipaddress.IPv4Address 不支持在列上明智的操作向量。

试试这个:

df['int_network'] = df['Network'].apply(lambda x: int(ipaddress.IPv4Address(x)))

另外,请确保在调试时在try, catch 中打印出原始错误消息和堆栈跟踪。

【讨论】:

    【解决方案2】:

    你可以像这样转换成整数:

    import socket
    import struct
    
    def ip2int(addr):
        return struct.unpack("!I", socket.inet_aton(addr))[0]
    
    dff=io.StringIO("""ms network subnet dest unk ASN1, ASN2, ASN3, ASN4, ASN5
    0 * 1.0.0.0 24.0 202.12.28.1 0 4777 13335 i NaN NaN
    1 * 1.0.4.0 22.0 202.12.28.1 0 4777 6939 4826 38803 56203
    2 * 1.0.4.0 24.0 202.12.28.1 0 4777 6939 4826 38803 56203""")
    
    sub = pd.read_csv(dff, sep=' ')     
    
    sub.network.apply(lambda x: ip2int(x)) 
    #0    16777216
    #1    16778240
    #2    16778240
    #Name: network, dtype: int64
    
    ```
    

    【讨论】:

      【解决方案3】:

      您可以使用库 DataPrep 中的函数 clean_ip。使用pip install dataprep 安装它。

      from dataprep.clean import clean_ip
      df = pd.DataFrame({"Network": ["1.0.0.0", "1.0.4.0", "1.0.4.0"]})
      
      df2 = clean_ip(df, "Network", output_format="integer")
      # print(df2)
         Network  Network_clean
      0  1.0.0.0       16777216
      1  1.0.4.0       16778240
      2  1.0.4.0       16778240
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        • 2014-03-03
        • 2012-06-11
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        相关资源
        最近更新 更多