如何在熊猫中将所有IP地址列表转换为十进制数字

时间:2019-01-20 05:57:55

标签: pandas

有大量的列表数据,如何将所有IP地址转换为熊猫中的十进制数字并与第二列的值合并

   import pandas as pd
   filename = "/Users/sda/Desktop/file"
   pdd = pd.read_csv(filename,header=None,sep='|',error_bad_lines=False, warn_bad_lines=False,skiprows=[0],
              names=['Name','Code','Ipv', 'Ip','Range','Date', 'Category'])
   pd.options.display.max_columns = None
   k = pdd[pdd['Ipv'].str.contains("ipv4") & pdd['Ip'].str.contains('[0-9]')]
   print(k[['Ip','Range','Code']])

我的输出:

        Ip         Range    Code
     2.16.0.0      524288   EU
     200.109.100.0 1024     RU
     200.109.102.0 1024     RU

只需要获取具有相同国家代码和范围号的第一个IP地址的十进制值即可,仅与第二列的值合并

       IP         range code
    3362612224    2028  RU

1 个答案:

答案 0 :(得分:1)

IIUC,考虑到输出的数据帧名称为df,如下所示:

import socket, struct

def ip2int(ip):
    """
    Convert an IP string to int
    """
    packedIP = socket.inet_aton(ip)
    return struct.unpack("!L", packedIP)[0]

df['ip_int'] = df.Ip.apply(ip2int)
df['range_sum']=df.groupby(['Code'])['Range'].transform('sum')
df[df.Code.duplicated(keep='last')]

               Ip  Range Code      ip_int  range_sum
 1  200.109.100.0   1024   RU  3362612224       2048