You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Jupyter中清理推文@用户出错,修改后仍无法删除的问题求助

错误原因分析与解决方法

第一段代码的报错原因

  • 未处理非字符串数据:如果df['text']里包含NaN、数字这类非字符串值,re.findall会直接抛出类型错误,因为它要求输入必须是字符串。
  • 冗余的循环替换:用re.findall遍历匹配项再逐个替换完全没必要,re.sub本身就支持一次性替换所有匹配内容,这种写法既低效又容易出问题。

第二段代码无效的原因

  • 关键错误:返回了原始数据:函数内部生成了替换后的input_txt,但最后返回的是未修改的Tweet,等于替换操作白做了。
  • 替换逻辑错误:每次循环都基于原始的str(Tweet)进行替换,而不是在上一次替换的结果上继续处理,就算最后返回input_txt,也只能保留最后一次替换的效果,无法清除所有@用户标识。
  • 未处理空值:如果Tweet是NaN,str(Tweet)会变成字符串"nan",最终会保留在结果里,不符合清理需求。

正确的解决代码

方法一:优化函数+vectorize

import re
import numpy as np
import pandas as pd

def remove_pattern(input_txt, pattern):
    # 处理空值,转为空字符串
    if pd.isna(input_txt):
        return ""
    # 确保输入为字符串类型
    input_str = str(input_txt)
    # 一次性替换所有匹配的@用户标识
    return re.sub(pattern, '', input_str)

# 应用到DataFrame,正则用@\w+更严谨(匹配至少一个字符的用户名)
df['remove_user'] = np.vectorize(remove_pattern)(df['text'], r"@\w+")

方法二:用pandas apply简化代码

df['remove_user'] = df['text'].apply(
    lambda x: re.sub(r"@\w+", '', str(x)) if not pd.isna(x) else ""
)

代码说明

  • 用re.sub(r"@\w+", '', input_str)直接全局替换,效率更高,逻辑更清晰,避免循环冗余。
  • 增加了NaN值处理,避免结果中出现"nan"这类无效字符串。
  • 正则表达式@\w+比原代码的@[\w]*更严谨:+要求匹配至少一个字符的用户名,不会匹配单独的@符号(如果存在的话)。

内容的提问来源于stack exchange,提问作者Up InCafe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:36:16