
本文介绍如何使用 pandas 高效识别并复制以问号、句号或感叹号结尾的行,同时生成对应去标点的新行,适用于数据清洗与文本增强场景。
本文介绍如何使用 pandas 高效识别并复制以问号、句号或感叹号结尾的行,同时生成对应去标点的新行,适用于数据清洗与文本增强场景。
在自然语言处理或对话数据预处理中,常需对带标点的句子进行“标准化扩展”——例如将 "Hi!" 拆分为原始带标点行和去标点变体行,以提升模型对语气变体的鲁棒性。Pandas 提供了简洁高效的向量化操作来实现这一目标。
核心思路是三步法:
- 筛选:用 .str.endswith() 同时匹配多个结尾标点(注意:该方法不支持正则通配,需传入元组);
- 清洗:对筛选出的子集统一截去末字符(.str[:-1]),适用于单字符标点场景;
- 合并:使用 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() 循环。
通过此方法,你可在一行代码级精度完成语义等价但形式不同的样本扩充,为下游任务提供更丰富的训练信号。










