基于Pandas的IP地址数值段缺口填充脚本实现咨询
实现思路
- 先对原始DataFrame按
START_IP_NUMBER升序排序,保证相邻行的IP段是按顺序排列的 - 逐行遍历数据,对比当前行的
START_IP_NUMBER和上一行的END_IP_NUMBER,判断是否存在数值缺口 - 存在缺口时生成补全行,补全行的起止数值为缺口的起止值,同时将数值转换为对应的IP地址
- 最终合并所有行得到补全后的结果
完整代码实现
import pandas as pd import socket import struct # 定义数值转IP地址的工具函数 def num_to_ip(ip_num: int) -> str: return socket.inet_ntoa(struct.pack('!I', ip_num)) # 原始数据示例 data = { "START_IP_NUMBER": [16777216, 16777472, 16802816], "END_IP_NUMBER": [16777471, 16778239, 16802943], "START_IP_ADDRESS": ["1.0.0.0", "1.0.1.0", "1.0.100.0"], "END_IP_ADDRESS": ["1.0.0.255", "1.0.3.255", "1.0.100.127"] } df = pd.DataFrame(data) # 第一步:按起始IP数值排序,重置索引 df = df.sort_values("START_IP_NUMBER").reset_index(drop=True) processed_rows = [] prev_row = None for _, curr_row in df.iterrows(): if prev_row is not None: # 计算缺口的起止数值 gap_start = prev_row["END_IP_NUMBER"] + 1 gap_end = curr_row["START_IP_NUMBER"] - 1 # 存在有效缺口则插入补全行 if gap_start <= gap_end: processed_rows.append({ "START_IP_NUMBER": gap_start, "END_IP_NUMBER": gap_end, "START_IP_ADDRESS": num_to_ip(gap_start), "END_IP_ADDRESS": num_to_ip(gap_end) }) # 添加当前原始行 processed_rows.append(curr_row.to_dict()) prev_row = curr_row # 生成最终结果 result_df = pd.DataFrame(processed_rows) print(result_df)
输出验证
运行上述代码后,会在第二行和第三行之间插入补全行,结果如下:
| START_IP_NUMBER | END_IP_NUMBER | START_IP_ADDRESS | END_IP_ADDRESS |
|---|---|---|---|
| 16777216 | 16777471 | 1.0.0.0 | 1.0.0.255 |
| 16777472 | 16778239 | 1.0.1.0 | 1.0.3.255 |
| 16778240 | 16802815 | 1.0.4.0 | 1.0.99.255 |
| 16802816 | 16802943 | 1.0.100.0 | 1.0.100.127 |
完全符合需求要求。
内容的提问来源于stack exchange,提问作者Phani Kumar
相关产品推荐
相关产品推荐

