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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:24:07