如何将Pandas列中的日期与文本拆分至新列并按规则映射?
问题描述
现有如下Pandas DataFrame:
col1 col2 text col4 1 a1 12/07/2023 a2 2 a1 abc a2 3 a1 12/06/2022 a2 4 a1 def a2 5 a1 fgh a2 6 a1 a2 7 a1 xxx a2
期望得到的结果DataFrame如下:
col1 col2 text date col4 1 a1 abc 12/07/2023 a2 2 a1 def 12/06/2022 a2 3 a1 fgh 12/06/2022 a2 4 a1 xxx a2
规则说明:
- 若文本的紧邻前一行是日期,则该文本对应此日期;
- 若一个日期后有多条文本,所有文本均对应该日期;
- 若文本的紧邻前一行是空值,则该文本对应的日期为空。
核心逻辑仅需关注文本的紧邻前一行是否存在日期。
实现方案
可以通过以下步骤用Python+Pandas实现需求:
标记日期行与空行
用正则匹配MM/DD/YYYY格式的日期,标记出原始数据中的日期行;同时标记空行,用于后续分割分组。分组填充日期
以空行为分割点分组,在每个分组内将日期值向下填充,确保空行后的文本不会继承之前的日期。过滤整理结果
过滤掉原始的日期行和空行,只保留有效文本行,最后重置序号并调整列顺序。
完整代码如下:
import pandas as pd import re # 构造原始DataFrame data = { 'col1': [1,2,3,4,5,6,7], 'col2': ['a1']*7, 'text': ['12/07/2023', 'abc', '12/06/2022', 'def', 'fgh', '', 'xxx'], 'col4': ['a2']*7 } df = pd.DataFrame(data) # 标记日期行:匹配MM/DD/YYYY格式 date_pattern = r'^\d{2}/\d{2}/\d{4}$' df['is_date'] = df['text'].str.match(date_pattern, na=False) # 生成日期列:日期行保留text值,其余先设为NaN df['date'] = df['text'].where(df['is_date']) # 按空行分组,在分组内向下填充日期 df['group'] = (df['text'] == '').cumsum() df['date'] = df.groupby('group')['date'].ffill() # 过滤有效行:保留非日期且text非空的行 result_df = df[(~df['is_date']) & (df['text'] != '')].copy() # 重置col1的序号 result_df['col1'] = range(1, len(result_df)+1) # 整理列顺序,移除辅助列 result_df = result_df[['col1', 'col2', 'text', 'date', 'col4']] print(result_df)
代码说明:
- 正则表达式
^\d{2}/\d{2}/\d{4}$精准匹配目标日期格式,避免误判; - 按空行分组后填充日期,确保空行后的文本不会继承之前的日期,符合规则要求;
- 最后过滤无效行并重置序号,完全匹配期望的结果结构。
内容的提问来源于stack exchange,提问作者Django0602
相关产品推荐
相关产品推荐

