Pandas 实战:按字符串末尾标点符号智能复制行并去除标点

2次阅读

Pandas 实战:按字符串末尾标点符号智能复制行并去除标点

本文介绍如何使用 pandas 高效识别并复制以问号、句号或感叹号结尾的行,同时生成对应去标点的新行,适用于数据清洗与文本增强场景。

本文介绍如何使用 pandas 高效识别并复制以问号、句号或感叹号结尾的行,同时生成对应去标点的新行,适用于数据清洗与文本增强场景。

在自然语言处理或对话数据预处理中,常需对带标点的句子进行“标准化扩展”——例如将 “Hi!” 拆分为原始带标点行和去标点变体行,以提升模型对语气变体的鲁棒性。Pandas 提供了简洁高效的向量化操作来实现这一目标。

核心思路是三步法:

  1. 筛选:用 .str.endswith() 同时匹配多个结尾标点(注意:该方法不支持正则通配,需传入元组);
  2. 清洗:对筛选出的子集统一截去末字符(.str[:-1]),适用于单字符标点场景;
  3. 合并:使用 pd.concat() 垂直拼接原 DataFrame 与处理后的副本,保留原始索引(可选 ignore_index=True 重置索引)。

以下是完整可运行示例:

import pandas as pd  # 构造示例数据 df = pd.DataFrame({     'msg': ["hello", "hi!", "What?", "OK.", "test"],     'label': [1, 0, 2, 3, 4] })  # 步骤1:筛选以 ?, ., ! 结尾的行(注意:传入元组而非字符串) mask = df['msg'].str.endswith(('?', '.', '!')) punc_rows = df[mask].copy()  # 显式 copy 避免 SettingWithCopyWarning  # 步骤2:批量移除末尾标点(安全写法:仅当长度≥1时截取) punc_rows['msg'] = punc_rows['msg'].str.slice(stop=-1)  # 步骤3:合并原表与增强表 result = pd.concat([df, punc_rows], ignore_index=True) print(result)

输出结果:

msg  label 0  hello      1 1    hi!      0 2  What?      2 3    OK.      3 4   test      4 1     hi      0 2  What      2 3    OK      3

⚠️ 注意事项

  • .str.endswith((‘?’, ‘.’, ‘!’)) 必须传入元组,传入字符串(如 ‘?.!’)会被视为匹配整个子串,导致逻辑错误;
  • 若存在多字标点(如 !! 或 ?!),str[:-1] 仅移除一个字符,此时应改用正则替换:punc_rows[‘msg’] = punc_rows[‘msg’].str.replace(r'[?.!]$’, ”, Regex=True);
  • pd.concat() 默认保留原始索引,若需连续整数索引,请务必添加 ignore_index=True;
  • 对于大规模数据,该方案时间复杂度为 O(n),性能优异,无需 apply() 循环

通过此方法,你可在一行代码级精度完成语义等价但形式不同的样本扩充,为下游任务提供更丰富的训练信号。

text=ZqhQzanResources