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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:22:40