pandas - 如何在 Pandas 中将所有 IP 地址列表转换为十进制数字
问题描述
有巨大的列表数据,如何将所有IP地址转换为pandas中的十进制数字并与第二列的值合并
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
解决方案
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
推荐阅读
- ios - 区别需要MainQueueSetup 和dispatch_get_main_queue?
- java - java.lang.ClassNotFoundException:模型。数据库(表)
- angularjs - angularjs中路由更改后如何重新加载ng-include
- sbt - ScalaJS 插件 0.6.23:“值 %%% 不是字符串的成员”
- xml - oracle 中的 .xsd 导入问题
- java - java.time.format.DateTimeParseException 使用 DateTimeFormatter
- c# - 在 MessageBox 中显示结果
- c# - 如何使用泛型在 Linq for DocumentDB 中创建多个/嵌套 SelectMany 联接
- javascript - Reactjs - 无法发布 /images 错误
- java - 在 ArrayIndexOutOfBoundsException 中对程序执行结果进行排序