如何更高效地对数据集的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
相关产品推荐
相关产品推荐

