Pandas文本清洗:如何移除字符串内(含词内)的标点符号?
解决Pandas分词文本中移除所有标点的问题
你的代码目前仅过滤了整个元素为标点的项,无法处理单词内嵌的标点,也解决不了Asia's被拆成两个独立词的问题。要彻底移除所有标点(不管是单独存在的还是嵌在单词里的),可以试试下面两种实用方法:
方法1:逐个处理单词,移除内部标点
直接遍历分词后的每个单词,清除单词内的所有标点,同时过滤掉处理后为空的字符串。
修改后的代码:
import string punc = string.punctuation # 定义清洗单个单词列表的函数 def clean_word_list(word_list): cleaned_words = [] for word in word_list: # 移除当前单词里的所有标点字符 no_punc_word = ''.join([char for char in word if char not in punc]) # 只保留非空的处理结果,顺便转小写 if no_punc_word: cleaned_words.append(no_punc_word.lower()) return cleaned_words # 应用到DataFrame的目标列上 updated_mall['Cleansed_description'] = updated_mall['Cleansed_description'].apply(clean_word_list) updated_mall.head(105)
该方法会把fast-paced转为fastpaced,把拆分后的Asia、'、s处理为asia和s,同时彻底移除独立的.、“这类标点。
方法2:先拼接成完整文本再统一处理
把分词后的列表重新拼接成完整字符串,统一移除标点、转小写后再重新分词,能解决所有格被拆分的问题(比如原本的today ’ s会合并为today s)。
代码示例:
import string import re punc = string.punctuation def clean_text_from_list(word_list): # 将单词列表拼接为完整文本 full_text = ' '.join(word_list) # 用正则批量移除所有标点 no_punc_text = re.sub(f'[{re.escape(punc)}]', '', full_text) # 转小写后重新按空格分词 cleaned_list = no_punc_text.lower().split() return cleaned_list updated_mall['Cleansed_description'] = updated_mall['Cleansed_description'].apply(clean_text_from_list) updated_mall.head(105)
这种方式更灵活,能一次性处理所有标点场景,同时让原本因标点拆分的语义相关词汇回归连贯的文本逻辑。
额外提示
如果需要保留某些特殊标点(比如连字符-、所有格符号’),可以从标点集合中剔除它们:
# 保留连字符和所有格符号 punc = string.punctuation.replace('-', '').replace('’', '')
内容的提问来源于stack exchange,提问作者bird
相关产品推荐
相关产品推荐

