如何编写支持任意文本输入的pandas DataFrame列清洗函数
代码存在的核心问题
- 所有清洗操作没有生效,也没有返回值:pandas的
.str类方法、replace()方法默认都是返回新的Series对象,不会原地修改原DataFrame。你的代码只执行了操作但没有把结果赋值回原DataFrame的对应列,同时函数没有写return语句,默认返回None,所以调用后得到的结果是空。 - 测试DataFrame构造错误:你当前的写法是把文本字符串直接作为字典的键,生成的DataFrame结构不符合预期,正确写法需要明确指定列名和对应的文本值列表。
- 特殊字符替换逻辑存在bug:循环替换时没有处理正则元字符的问题,比如
.、+、*这些符号在正则中有特殊含义,str.replace默认开启正则的情况下会匹配错误内容,同时循环替换效率极低,可以用正则表达式一次性完成所有特殊字符的移除。 - 冗余代码:重复写了两次转小写的操作,没有必要。
修正后的完整代码
import pandas as pd def my_function(x): # 提取第一列存为临时变量,避免反复写iloc[:,0] text_col = x.iloc[:, 0].copy() # 转小写 text_col = text_col.str.lower() # 移除换行符 text_col = text_col.replace(r'\n', ' ', regex=True) # 一次性移除所有特殊字符,正则里把要移除的字符放在[]里即可,注意转义特殊元字符 text_col = text_col.replace(r'[!"%&\'()#*?+,-./:;<=>@\[\\\]^_`{|}~–’]', ' ', regex=True) # 移除数字 text_col = text_col.replace(r'\d+', ' ', regex=True) # 移除单个字符 text_col = text_col.replace(r'\b[a-zA-Z]\b', ' ', regex=True) # 移除前后空格 text_col = text_col.str.strip() # 多空格合并为单空格 text_col = text_col.replace(r' +', ' ', regex=True) # 移除-- text_col = text_col.replace(r'--', '', regex=True) # 把清洗后的列赋值回原DataFrame,也可以直接返回text_col根据需求调整 x.iloc[:, 0] = text_col return x # 测试代码 my_variable = "WHAT A WONDERFUL WORLD!" # 正确构造DataFrame,指定列名,值放在列表里 df_Text = pd.DataFrame({'raw_text': [my_variable]}) output = my_function(df_Text) print(output)
运行后输出结果为:
raw_text 0 wonderful world
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

