如何在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)有两个核心问题:
- 正则里的括号会把匹配内容作为拆分结果的一部分,但没考虑到后续多行描述属于同一个记录;
- 后面的
str.split(-,n=3)是语法错误,分隔符得用字符串形式,而且没处理换行的多行描述场景。
内容的提问来源于stack exchange,提问作者PCH
相关产品推荐
相关产品推荐

