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

如何在Pandas DataFrame中提取日期间文本并拆分为指定列?

解决Pandas DataFrame多行文本拆分问题

嘿,我来帮你搞定这个跨行多记录的文本拆分需求,一步步来:

步骤1:预处理原始数据,补全编号并合并多行文本

首先你的原始数据里info no列有不少空值,这些空值其实属于上一个非空的编号,先把它们补全;然后把同一个编号对应的所有Description行合并成完整字符串,方便后续分割。

假设你的原始DataFrame是df,先做预处理:

import pandas as pd
import re

# 用前一个非空值填充info no列的空值
df['info no'] = df['info no'].ffill()

# 合并同一个info no下的所有Description行,每行用换行符连接
df_merged = df.groupby('info no')['Description'].apply(lambda x: '\n'.join(x)).reset_index()

步骤2:拆分合并后的文本为独立记录

每个记录都是以MM-DD-YYYY HH:MM:SS格式的日期开头,用正则匹配这个开头来拆分每个编号下的文本:

# 匹配日期开头的正则模式(正向预查,确保分割后保留日期部分)
pattern = r'(?=\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2} -)'

# 拆分每个info no的文本为多个记录,过滤掉空字符串
df_merged['records'] = df_merged['Description'].apply(lambda x: re.split(pattern, x))
df_merged['records'] = df_merged['records'].apply(lambda x: [r.strip() for r in x if r.strip()])

步骤3:提取每个记录的字段

现在把每个记录展开成单独的行,再从记录里拆分出DATE、NAME和DESCRIPTION:

# 展开records列,每个记录单独成一行
df_expanded = df_merged.explode('records').reset_index(drop=True)

# 定义提取字段的函数
def extract_fields(record):
    # 先分割日期部分和剩余内容
    date_part, rest = record.split(' - ', 1)
    # 再分割名字和描述内容
    name_part, desc_part = rest.split(' (Work notes) ', 1)
    # 把描述里的多行拆分成列表,方便后续展开
    desc_lines = desc_part.split('\n')
    return date_part.strip(), name_part.strip(), desc_lines

# 应用函数提取字段
df_expanded[['DATE', 'NAME', 'DESCRIPTION']] = df_expanded['records'].apply(
    lambda x: pd.Series(extract_fields(x))
)

步骤4:生成最终的多行描述格式

最后把多行描述展开,同时保持同一记录的info no、DATE、NAME仅在第一行显示,后续行留空:

# 展开DESCRIPTION的多行内容
final_df = df_expanded.explode('DESCRIPTION').reset_index(drop=True)

# 标记同一记录的后续行,对应列设为空
group_key = ['info no', 'DATE']
for col in group_key + ['NAME']:
    final_df[col] = final_df.groupby(group_key)[col].transform(
        lambda x: x.iloc[0] if x.name[1] == x.iloc[0] else ''
    )

# 调整列顺序到期望的格式
final_df = final_df[['info no', 'DATE', 'NAME', 'DESCRIPTION']]

这样处理后,final_df就完全符合你想要的输出格式了。

说说你之前代码的问题

你之前尝试的re.split('(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2}:\\d{2} -.*)',Description)有两个核心问题:

  1. 正则里的括号会把匹配内容作为拆分结果的一部分,但没考虑到后续多行描述属于同一个记录;
  2. 后面的str.split(-,n=3)是语法错误,分隔符得用字符串形式,而且没处理换行的多行描述场景。

内容的提问来源于stack exchange,提问作者PCH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:23:00