咨询Pandas处理DataFrame时移除@开头子串、按用户名与清洗文本去重的实现方法
文本清洗与重复行处理实现方案
项目核心目标
个人项目开发中需要完成两项数据处理操作:
- 从存储文本内容的列中,移除所有以@开头的提及类子串
- 文本清洗完成后,删除同时具备相同
username、相同清洗后文本的重复行
初始DataFrame结构示例
username text A @john testing this! B @john what is up? A @smudge @renge testing this!
预期最终输出结果
username text A testing this! B what is up?
当前已尝试的实现与现存问题
最初编写的实现逻辑如下:
# 生成清洗后的临时文本列 df['clean_text']=df['text'].str.replace('(@\w+.*?)',"") # 基于用户名、清洗后文本去重 df = df.drop_duplicates(subset = ['clean_text', 'username'])
后续参考公开方案做了两项调整,重复行依旧无法正常清除:
- 将正则替换规则修改为
(@\w+\s*) - 执行
df.columns = df.columns.str.strip()去除所有列名的首尾空格
失效原因定位
之前的实现存在两个核心漏洞:
- 第一版正则规则
(@\w+.*?)匹配范围错误,非贪婪匹配从@位置开始会吞掉后续大段非目标内容,完全达不到只删除@提及的效果;后续调整的(@\w+\s*)虽然覆盖了大部分@提及场景,但没有处理清洗后文本残留的首尾多余空格。 - 去重环节没有对清洗后文本做空格裁剪,字符串的隐形首尾空格差异,会让pandas将语义完全一致的文本判定为不同值,直接导致去重逻辑失效。
可直接复用的实现代码
import pandas as pd import re # 匹配所有@开头、后接非空白字符的提及内容,替换后自动裁剪首尾空格 at_pattern = re.compile(r'@\S+') df['clean_text'] = df['text'].str.replace(at_pattern, '', regex=True).str.strip() # 基于用户名、裁剪后的清洗文本去重,保留首次出现的行 df = df.drop_duplicates(subset=['username', 'clean_text'], keep='first') # 可选操作:将清洗后的内容覆盖回原text列,删除临时生成的clean_text列 df['text'] = df['clean_text'] df = df.drop(columns=['clean_text']).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Aravind VP
相关产品推荐
相关产品推荐

