商城首页欢迎来到中国正版软件门户

您的位置:首页 >Pandas实战:按末尾标点复制行并去标点

Pandas实战:按末尾标点复制行并去标点

  发布于2026-03-09 阅读(0)

扫一扫,手机访问

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() 循环。

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

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注