Pandas如何从字符串列提取V0-V20格式版本号并生成对应新列
实现代码
import pandas as pd import numpy as np # 构造原始DataFrame d = {'col1': [1, 2,3,4,5,60,0,0,6,3,2,4], 'col3': [1, 22,33,44,55,60,1,5,6,3,2,4], 'Name': ['22a| df a1asd_V1|5P|hey-910929|abc-939090', 'xcd a2asd_V3','23vg aabsd_V1','22a| df a1asd_V1|5P|hey-910929|abc-939090','a3as d_V1','aa bsd_V3','aasd_V4','aabsd_V4','aa_adn sd_V15',np.nan,'aasd_V12','aasd120Abs'], 'Date': ['2021-06-13', '2021-06-13','2021-06-13','2021-06-14','2021-06-15','2021-06-15','2021-06-13','2021-06-16','2021-06-13','2021-06-13','2021-06-13','2021-06-16']} dff = pd.DataFrame(data=d) # 提取V+数字的版本标识,限制数字范围0-20 dff['Version'] = dff['Name'].str.extract(r'(V(?:20|1[0-9]|[0-9]))', expand=False) # 生成“Version + 数字”格式的字段,无匹配留空 dff['Version_full'] = dff['Version'].apply(lambda x: f'Version {x[1:]}' if pd.notna(x) else '') # 将未匹配到的NaN替换为空字符串 dff['Version'] = dff['Version'].fillna('')
运行后输出结果完全符合需求。
相关说明
- 正则逻辑:
(V(?:20|1[0-9]|[0-9]))中?:标记内部分组不单独捕获,保证str.extract只返回完整的V+数字字符串;数字匹配优先级为20→10-19→0-9,避免出现匹配截断问题。 - pandas中对应SQL LIKE的功能可以用
str.contains()实现,示例如下:# 等价于 WHERE Name LIKE '%V1%' dff[dff['Name'].str.contains('V1', na=False)] # 等价于 WHERE Name LIKE '22a%' 前缀匹配 dff[dff['Name'].str.contains(r'^22a', na=False)] # 等价于 WHERE Name LIKE '%_V1' 后缀匹配 dff[dff['Name'].str.contains(r'_V1$', na=False)]
内容的提问来源于stack exchange,提问作者rra
相关产品推荐
相关产品推荐

