如何清除Pandas DataFrame列中的表情符号?自定义函数对单个字符串有效但对整列无效
解决Pandas DataFrame列中表情符号无法清除的问题
这种情况确实有点棘手——单独用decontracted处理字符串数组时表情能正常清理,放到DataFrame列上就失效,而且其他规则(删链接、@用户名)都没问题。我帮你分析下可能的原因,再给几个可行的解决方案:
核心问题分析
看你的代码执行顺序和Pandas的字符串类型处理,大概率是两个点导致的:
- 函数内步骤顺序冲突:你在
decontracted里先执行了re.sub(r'[^\x00-\x7f]',r'', phrase)(删除所有非ASCII字符),但后面又调用remove_emoji。部分表情是Unicode代理对(比如\ud83d\ude18),这步操作可能把代理对拆成无法被remove_emoji正则匹配的碎片,反而导致表情残留。 - Pandas
string类型的编码差异:你把列转成了Pandas专属的string类型,它对Unicode字符的内部处理和原生Python字符串有差异,可能导致正则匹配表情的规则失效。
解决方案一:调整函数执行顺序
把remove_emoji移到删除非ASCII字符的步骤之前,确保完整的表情能被正则匹配到:
def decontracted(phrase): # specific phrase = phrase.rstrip() phrase = ' '.join(phrase.split()) phrase = re.sub(r'\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*', '', phrase) phrase = re.sub('@[\w]+','',phrase) # 先清除表情,再处理非ASCII字符 phrase = remove_emoji(phrase) phrase = re.sub(r'[^\x00-\x7f]',r'', phrase) # general phrase = re.sub('@[^\s]+','',phrase) phrase = remove_accented_chars(phrase) phrase = remove_special_characters(phrase) return phrase
解决方案二:改用原生字符串类型处理
把Pandas的string类型换成Python原生的object类型,避免Pandas对字符串的特殊编码处理:
# 修改DataFrame列类型部分的代码 AAVE['sentence'] = AAVE['sentence'][0:391165].astype(object) AAVE = AAVE.dropna() AAVE['sentence1'] = AAVE['sentence'].apply(decontracted)
解决方案三:增强表情匹配正则
如果上面的方法还不行,可以扩展remove_emoji的正则规则,覆盖更多Unicode表情范围:
def remove_emoji(string): emoji_pattern = re.compile( "[" u"\U0001F600-\U0001F64F" # emoticons u"\U0001F300-\U0001F5FF" # symbols & pictographs u"\U0001F680-\U0001F6FF" # transport & map symbols u"\U0001F1E0-\U0001F1FF" # flags (iOS) u"\U00002500-\U00002BEF" # various symbols u"\U00002702-\U000027B0" u"\U000024C2-\U0001F251" u"\U0001f926-\U0001f937" u"\U00010000-\U0010ffff" u"\u2640-\u2642" u"\u2600-\u2B55" u"\u200d" u"\u23cf" u"\u23e9" u"\u231a" u"\ufe0f" # variation selectors-16 u"\u3030" "]+", flags=re.UNICODE) return emoji_pattern.sub(r'', string)
额外建议:检查数据加载编码
加载TSV时指定UTF-8编码,避免表情符号在加载阶段就被转义损坏:
AAVE = pd.read_csv('twitteraae_all_aa', sep='\t', on_bad_lines='skip', encoding='utf-8')
你可以先试试方案一+方案二,应该就能解决表情残留的问题了。
内容的提问来源于stack exchange,提问作者Kwaku
相关产品推荐
相关产品推荐

