You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效地对数据集的MAC地址进行字符串切片处理?

高效处理DataFrame中MAC地址的截取需求

场景与需求

我有一个包含MAC地址的数据集,结构如下:

import numpy as np
import pandas as pd

dataset = {'Col1': ['10:50:1C:56:FF:C1', np.nan, '56:20:30:70:10:00'], 
           'Col2': [np.nan, '50:60:40:10:00:00', np.nan]}
dataframe = pd.DataFrame(data=dataset)

原始DataFrame展示:

Col1               Col2
0   10:50:1C:56:FF:C1   NaN
1   NaN                50:60:40:10:00:00
2   56:20:30:70:10:00   NaN

需要将其中有效的MAC地址截取为前7个字符(即字符串前8位,格式为XX:XX:XX),处理后结果如下:

Col1               Col2
0   10:50:1C           NaN
1   NaN                50:60:40
2   56:20:30           NaN

之前用循环实现了需求,但效率和内存表现不佳,希望找到更Pythonic、高效且低内存的方法。


解决方案

下面是几种基于Pandas矢量化操作的高效实现,避开循环带来的性能损耗:

方法1:使用str.slice矢量化截取(推荐)

利用Pandas的字符串方法str.slice直接对整列进行矢量化操作,这是最简洁高效的方式,无需自定义函数:

# 对所有列批量处理
processed_df = dataframe.apply(lambda col: col.str.slice(0, 7))

或者指定具体列处理:

processed_df = dataframe.copy()
processed_df['Col1'] = processed_df['Col1'].str.slice(0, 7)
processed_df['Col2'] = processed_df['Col2'].str.slice(0, 7)

Pandas的字符串方法会自动跳过NaN值,无需额外判断,性能远优于循环。

方法2:正则表达式替换

参考你之前处理IP的思路,用正则匹配MAC地址的前三段并保留:

processed_df = dataframe.replace(r'^([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}):.*', r'\1', regex=True)

这个正则会匹配以XX:XX:XX:开头的MAC地址,替换为前三段,同样自动忽略NaN。如果需要严格匹配MAC格式,还可以调整正则的精准度,但对于当前需求,这个写法足够高效。

方法3:优化自定义函数的矢量化调用

如果一定要保留自定义逻辑,别用行循环,改用applymap(但性能略逊于前两种):

def slice_mac(x):
    return x[:7] if pd.notna(x) else x

processed_df = dataframe.applymap(slice_mac)

这种方式比逐行循环高效,但还是不如直接用Pandas内置的字符串方法。


性能说明

  • 循环方法:时间复杂度O(n*m)(n为行数,m为列数),内存开销大,仅适合小数据集。
  • 矢量化方法(str.slice/正则):时间复杂度接近O(n),利用Pandas底层优化,内存占用更低,适合大数据集。

内容的提问来源于stack exchange,提问作者CatDad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:31:15