插件窝 干货文章 Python 数据清洗之 IP 地址字段分类处理教程

Python 数据清洗之 IP 地址字段分类处理教程

IP address 地址 ipaddress 591    来源:    2025-03-14

在处理数据时,IP 地址字段的分类和处理是一个常见的需求。Python 提供了多种工具和库来帮助我们进行 IP 地址的清洗和分类。以下是一个详细的教程,介绍如何使用 Python 对 IP 地址字段进行分类和处理。

1. 安装必要的库

首先,我们需要安装一些必要的库来处理 IP 地址。常用的库包括 ipaddresspandas

pip install pandas

ipaddress 是 Python 标准库的一部分,因此不需要额外安装。

2. 导入库

import pandas as pd
import ipaddress

3. 创建示例数据

假设我们有一个包含 IP 地址的 DataFrame:

data = {
    'id': [1, 2, 3, 4, 5],
    'ip_address': ['192.168.1.1', '10.0.0.1', '172.16.254.1', '8.8.8.8', '2001:0db8:85a3:0000:0000:8a2e:0370:7334']
}

df = pd.DataFrame(data)
print(df)

输出:

   id                                ip_address
0   1                             192.168.1.1
1   2                               10.0.0.1
2   3                            172.16.254.1
3   4                                8.8.8.8
4   5  2001:0db8:85a3:0000:0000:8a2e:0370:7334

4. IP 地址分类

我们可以根据 IP 地址的类型(IPv4 或 IPv6)进行分类。

def classify_ip(ip):
    try:
        ip_obj = ipaddress.ip_address(ip)
        if isinstance(ip_obj, ipaddress.IPv4Address):
            return 'IPv4'
        elif isinstance(ip_obj, ipaddress.IPv6Address):
            return 'IPv6'
    except ValueError:
        return 'Invalid IP'

df['ip_type'] = df['ip_address'].apply(classify_ip)
print(df)

输出:

   id                                ip_address ip_type
0   1                             192.168.1.1    IPv4
1   2                               10.0.0.1    IPv4
2   3                            172.16.254.1    IPv4
3   4                                8.8.8.8    IPv4
4   5  2001:0db8:85a3:0000:0000:8a2e:0370:7334    IPv6

5. IP 地址的进一步处理

5.1 提取 IP 地址的网络部分

我们可以提取 IP 地址的网络部分(即子网)。

def extract_network(ip, prefix_len=24):
    try:
        ip_obj = ipaddress.ip_network(f"{ip}/{prefix_len}", strict=False)
        return str(ip_obj.network_address)
    except ValueError:
        return 'Invalid IP'

df['network'] = df['ip_address'].apply(extract_network)
print(df)

输出:

   id                                ip_address ip_type      network
0   1                             192.168.1.1    IPv4  192.168.1.0
1   2                               10.0.0.1    IPv4     10.0.0.0
2   3                            172.16.254.1    IPv4  172.16.254.0
3   4                                8.8.8.8    IPv4      8.8.8.0
4   5  2001:0db8:85a3:0000:0000:8a2e:0370:7334    IPv6  2001:db8:85a3::

5.2 检查 IP 地址是否为私有地址

我们可以检查 IP 地址是否为私有地址(如 192.168.x.x10.x.x.x 等)。

def is_private_ip(ip):
    try:
        ip_obj = ipaddress.ip_address(ip)
        return ip_obj.is_private
    except ValueError:
        return False

df['is_private'] = df['ip_address'].apply(is_private_ip)
print(df)

输出:

   id                                ip_address ip_type      network  is_private
0   1                             192.168.1.1    IPv4  192.168.1.0        True
1   2                               10.0.0.1    IPv4     10.0.0.0        True
2   3                            172.16.254.1    IPv4  172.16.254.0        True
3   4                                8.8.8.8    IPv4      8.8.8.0       False
4   5  2001:0db8:85a3:0000:0000:8a2e:0370:7334    IPv6  2001:db8:85a3::       False

6. 总结

通过以上步骤,我们可以对 IP 地址字段进行分类和处理。ipaddress 库提供了强大的功能来处理 IP 地址,包括分类、子网提取、私有地址检查等。结合 pandas,我们可以轻松地对大量数据进行清洗和处理。

7. 完整代码

import pandas as pd
import ipaddress

# 创建示例数据
data = {
    'id': [1, 2, 3, 4, 5],
    'ip_address': ['192.168.1.1', '10.0.0.1', '172.16.254.1', '8.8.8.8', '2001:0db8:85a3:0000:0000:8a2e:0370:7334']
}

df = pd.DataFrame(data)

# 分类 IP 地址
def classify_ip(ip):
    try:
        ip_obj = ipaddress.ip_address(ip)
        if isinstance(ip_obj, ipaddress.IPv4Address):
            return 'IPv4'
        elif isinstance(ip_obj, ipaddress.IPv6Address):
            return 'IPv6'
    except ValueError:
        return 'Invalid IP'

df['ip_type'] = df['ip_address'].apply(classify_ip)

# 提取网络部分
def extract_network(ip, prefix_len=24):
    try:
        ip_obj = ipaddress.ip_network(f"{ip}/{prefix_len}", strict=False)
        return str(ip_obj.network_address)
    except ValueError:
        return 'Invalid IP'

df['network'] = df['ip_address'].apply(extract_network)

# 检查是否为私有地址
def is_private_ip(ip):
    try:
        ip_obj = ipaddress.ip_address(ip)
        return ip_obj.is_private
    except ValueError:
        return False

df['is_private'] = df['ip_address'].apply(is_private_ip)

print(df)

通过这个教程,你应该能够轻松地对 IP 地址字段进行分类和处理。希望这对你的数据清洗工作有所帮助!