如何用更Pythonic且高效的方法处理数据集IP地址,去除第四个八位组?
高效处理IP地址去除第四个八位组的方法
原始数据集
| 0 | 1 | 2 |
|---|---|---|
| 100.0.200.0 | 160.60.30.0 | NaN |
| NaN | 101.60.10.0 | 10.0.0.1 |
目标处理结果
| 0 | 1 | 2 |
|---|---|---|
| 100.0.200 | 160.60.30 | NaN |
| NaN | 101.60.10 | 10.0.0 |
当前低效实现代码
def sliceip(row): row = str(row) return row.rsplit(".",1)[0] def applysliceip(rowx): for i, item in enumerate(rowx): rowx[i] = sliceip(item) return rowx # 应用到整个DataFrame split_IPs = IPs.apply(lambda row: applysliceip(row))
高效Pythonic实现方案
方法1:向量化str.rsplit操作
Pandas的字符串方法支持批量处理,完全不需要手动循环,效率和内存表现远优于逐元素操作:
split_IPs = IPs.apply(lambda col: col.str.rsplit(".", 1).str[0])
更简洁的写法可以借助stack()统一处理后恢复结构:
split_IPs = IPs.stack().str.rsplit(".", 1).str[0].unstack()
方法2:正则替换
用正则匹配末尾的.数字格式直接替换为空,操作简单且高效:
split_IPs = IPs.replace(r'\.\d+$', '', regex=True)
正则表达式\.\d+$精准匹配IP地址的第四个八位组,替换后自动保留原有的NaN值。
方法3:定位截取
先找到每个IP最后一个.的位置,再截取前面的内容:
split_IPs = IPs.apply(lambda col: col.str.slice(0, col.str.rfind(".")))
以上方法均基于Pandas的向量化操作,避免了Python级别的循环,在处理大数据集时,速度和内存占用会有显著优化。
内容的提问来源于stack exchange,提问作者CatDad
相关产品推荐
相关产品推荐

