Pandas dataframe基于ATC编码拆分新增多列的高效实现方法问询
问题解答
1. ATC编码拆分的优化实现
你现有的手动切片函数可读性很好,也能正确完成拆分,如果想要更高效、更简洁的实现,推荐两种思路:
- 无自定义函数的矢量化实现:完全依托pandas原生的字符串操作,性能最优,适合大数据量场景
- 正则匹配实现:一行代码完成拆分,同时自带格式校验能力,不合法的ATC编码会返回NaN方便排查问题
2. 拆分结果批量写入DataFrame新增列
最优方案:使用pandas原生str.extract(兼顾简洁和性能)
固定结构的ATC编码可以通过正则一次性提取5个子段,直接生成5个新列:
import pandas as pd # 正则对应5个分组依次匹配atc1到atc5的长度规则 atc_df[['atc1', 'atc2', 'atc3', 'atc4', 'atc5']] = atc_df['atc'].str.extract(r'^(.)(.{2})(.)(.)(.{2})$')
次选方案:使用str.slice逐列赋值
如果你不想用正则,也可以单独切片赋值,逻辑更直观:
atc_df['atc1'] = atc_df['atc'].str.slice(0, 1) atc_df['atc2'] = atc_df['atc'].str.slice(1, 3) atc_df['atc3'] = atc_df['atc'].str.slice(3, 4) atc_df['atc4'] = atc_df['atc'].str.slice(4, 5) atc_df['atc5'] = atc_df['atc'].str.slice(5, 7)
沿用现有自定义函数的方案
如果你要保留已经写好的atc_split函数,可以通过apply的展开参数直接生成多列,适合小数据量场景:
def atc_split(atc_str): atc1 = atc_str[0] atc2 = atc_str[1:3] atc3 = atc_str[3] atc4 = atc_str[4] atc5 = atc_str[5:7] return(atc1,atc2,atc3,atc4,atc5) atc_df[['atc1', 'atc2', 'atc3', 'atc4', 'atc5']] = atc_df['atc'].apply(atc_split, result_type='expand')
性能说明
三种方案的性能从高到低排序为:str.slice逐列赋值 ≈ str.extract > 自定义函数+apply,数据量超过10万行时,前两种方案的速度是第三种的10倍以上。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

