如何按自定义字符串模式拆分pandas DataFrame的指定列?
问题说明
做Python数据处理时,有如下结构的DataFrame:
index value 3 05/21 6 05/23 7 330433 9 05/2430366 11 30366 12 05/25 14 05/26 15 30366 17 05/27 18 30366 20 05/28 21 30366 23 05/29 24 30366 26 05/31 27 29933
需要将value列按规则拆分为两列,预期结果如下:
date id 1 05/21 2 05/23 330433 3 05/24 30366 4 30366 5 05/25 6 05/26 30366 7 05/27 30366 8 05/28 30366 9 05/29 30366 10 05/31 29933
之前尝试用正则实现拆分未得到预期效果,测试代码如下:
import regex as re pat = '\*d{2}\/\d{2}\d*' s1 = '05/2130366' re.split(pat, s1)
问题原因
原有代码存在两个核心错误:
- 正则写法错误:匹配数字的元字符为
\d,原有代码误写为\*d,实际匹配逻辑是查找星号+字符d,完全无法匹配目标的日期、数字串 - 方法选择错误:
re.split会将匹配到的内容作为分隔符丢弃,无法提取需要的两部分分段内容,应该用正则捕获组配合匹配/提取方法实现。
实现方案
用正则捕获组分别提取两类内容:第一组匹配MM/DD格式的日期段(允许为空,适配纯数字的行),第二组匹配剩余的纯数字ID段(允许为空,适配纯日期的行),再用pandas的str.extract批量处理整列即可。
单字符串测试代码
import re pat = r'^(\d{2}/\d{2})?(\d+)?$' # 测试粘连的日期+ID串 s1 = '05/2430366' print(re.match(pat, s1).groups()) # 输出: ('05/24', '30366') # 测试纯ID串 s2 = '330433' print(re.match(pat, s2).groups()) # 输出: (None, '330433') # 测试纯日期串 s3 = '05/21' print(re.match(pat, s3).groups()) # 输出: ('05/21', None)
DataFrame批量处理代码
import pandas as pd # 构造原始测试数据 df = pd.DataFrame({ 'index': [3,6,7,9,11,12,14,15,17,18,20,21,23,24,26,27], 'value': ['05/21','05/23','330433','05/2430366','30366','05/25','05/26','30366','05/27','30366','05/28','30366','05/29','30366','05/31','29933'] }) # 批量拆分两列 df[['date', 'id']] = df['value'].str.extract(r'^(\d{2}/\d{2})?(\d+)?$') # 输出拆分结果 print(df[['date', 'id']])
运行后得到的逐行拆分结果如下,空值位置和预期结构完全匹配,如需做日期向下填充、合并行的操作,基于这个结果再调用ffill()、dropna()等方法即可实现。
date id 0 05/21 NaN 1 05/23 NaN 2 NaN 330433 3 05/24 30366 4 NaN 30366 5 05/25 NaN 6 05/26 30366 7 05/27 30366 8 05/28 30366 9 05/29 30366 10 NaN 30366 11 05/31 29933
内容的提问来源于stack exchange,提问作者ERIC
相关产品推荐
相关产品推荐

