基于Pandas与正则表达式拆分数据集混合值类型的方法求助
解决Pandas中NAME列混合值拆分与列对齐问题
核心思路
针对NAME列中「2-5位字符+6位数字+时间」的混合格式,用正则表达式拆分出纯名称+数字部分和时间部分,再把错位的TIME、Speed等列值重新对齐。
示例代码与步骤
假设你的数据集结构类似这样(部分行NAME列带时间,导致后续列错位):
import pandas as pd # 模拟错位数据集 data = { "NAME": ["测试数据12345610:30:00", "正常名称654321", "演示案例9876542024-05-20 14:20:00"], "TIME": ["60", "", "80"], "Speed": ["", "50", ""] } df = pd.DataFrame(data)
1. 编写正则表达式匹配混合格式
根据描述,正则需要捕获三个部分:2-5位字符的名称、6位数字、时间(支持常见的HH:MM:SS或YYYY-MM-DD HH:MM:SS格式):
# 正则分组:(名称)、(6位数字)、(时间),非捕获组处理连接部分 pattern = r"^([\u4e00-\u9fa5a-zA-Z]{2,5})(\d{6})(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|\d{2}:\d{2}:\d{2})$"
2. 提取拆分后的字段
用str.extract提取分组,得到新的列,同时标记哪些行是错位的:
# 提取拆分结果,不匹配的行返回NaN split_result = df["NAME"].str.extract(pattern) split_result.columns = ["Pure_NAME", "ID", "Extracted_TIME"] # 合并到原数据集 df = pd.concat([df, split_result], axis=1)
3. 重新对齐错位列
对于存在提取时间的行,原TIME列的值其实是Speed的值,需要把错位的值移到对应列,并用提取的时间覆盖TIME列:
# 处理错位行:将原TIME的值赋值给Speed,用提取的时间替换TIME mask = df["Extracted_TIME"].notna() df.loc[mask, "Speed"] = df.loc[mask, "TIME"] df.loc[mask, "TIME"] = df.loc[mask, "Extracted_TIME"] # 替换NAME列为纯名称+ID的组合 df.loc[mask, "NAME"] = df.loc[mask, "Pure_NAME"] + df.loc[mask, "ID"] # 清理临时列 df = df.drop(["Pure_NAME", "ID", "Extracted_TIME"], axis=1)
4. 最终结果
处理后的数据集会将错位的TIME、Speed列值正确对齐,NAME列恢复为纯名称+6位数字的格式:
NAME TIME Speed 0 测试数据123456 10:30:00 60 1 正常名称654321 50 2 演示案例987654 2024-05-20 14:20:00 80
注意事项
- 如果时间格式有其他变体(比如只有日期),需要调整正则表达式中的时间匹配部分
- 可以用
str.match先筛选出需要处理的行,减少不必要的计算 - 若数据量较大,建议用
str.extractall配合groupby处理更复杂的情况
内容的提问来源于stack exchange,提问作者user3103082
相关产品推荐
相关产品推荐

