Python pandas提取列首尾冒号间内容创建DataFrame新列
pandas 提取字符串首尾冒号间内容生成新列
问题背景
需要对pandas DataFrame做列派生:从现有crate列中提取第一个冒号与最后一个冒号之间的内容,生成新列main_cr,最终输出列顺序为site、stat、main_cr、crate。
原始数据样例:
site stat crate AA - site 1 ok AD1:00:AB5.30:100 AA - site 1 ok AD1:00:AB5.30:111 A1 - site 2 fail AD1:00:AB5.30:200 AA - site 1 ok AD1:00:AB5.30:555 BB - site 8 fail BB5:01:BA8.40:777
预期输出:
site stat main_cr crate AA - site 1 ok 00:AB5.30 AD1:00:AB5.30:100 AA - site 1 ok 00:AB5.30 AD1:00:AB5.30:111 A1 - site 2 fail 00:AB5.30 AD1:00:AB5.30:200 AA - site 1 ok 00:AB5.30 AD1:00:AB5.30:555 BB - site 8 fail 01:BA8.40 BB5:01:BA8.40:777
之前尝试的写法返回值不符合预期:
df['main_cr'] = df['crate'].str.split(':').str[1:3]
该写法返回的是['00', 'AB5.30']格式的列表,而非拼接完成的带冒号字符串,且写死切片位置的方式兼容性差。
实现方案
方案1:split切片后拼接(逻辑简单易读)
按冒号分割字符串后,切掉首尾两段(即第一个冒号前、最后一个冒号后的内容),剩余分段用冒号重新拼接即可,不需要写死切片位置,对不同分段长度的字段兼容性更好:
# 生成目标新列 df['main_cr'] = df['crate'].str.split(':').str[1:-1].str.join(':') # 调整列顺序匹配输出要求 df = df[['site', 'stat', 'main_cr', 'crate']]
方案2:正则提取(代码简洁,大数据量下性能更优)
通过正则捕获组直接匹配目标区间内容,一步完成提取:
df['main_cr'] = df['crate'].str.extract(r'^.*?:(.*):.*?$') df = df[['site', 'stat', 'main_cr', 'crate']]
正则逻辑说明:
^.*?:非贪婪匹配字符串开头到第一个冒号的内容(.*)贪婪匹配两个冒号之间的所有内容,自动定位到最后一个冒号前的位置,也就是我们需要提取的部分:.*?$匹配最后一个冒号到字符串结尾的内容
两种方案运行后都能完全匹配预期输出效果,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

