使用Pandas: str.replace() 进行文本清洗 | pandas replace中文
前段时间参加了Kaggle上的MercariPriceSuggestionChallenge[1]比赛,收获良多,过些时候准备进行一些全面的总结,本篇文章先谈一个比赛中用到的小技巧。这个比赛数据中有一个特征叫做"item_description",大致是一些商品描述,比如什么时候买的、新旧程度如何、什么牌子的等等。因为大部分都是Mercari这个网站(这个类似于国内的二手商品交易网站)上的用户自己填的商品描述,所以是极尽杂乱之能事,会出现很多夸张的符号,比如这样:另外的一大问题是用语规范不统一,比如$1.100和$1.1其实是一个意思,然而在对文本进行特征提取时就...
前段时间参加了Kaggle上的Mercari Price Suggestion Challenge[1]比赛,收获良多,过些时候准备进行一些全面的总结,本篇文章先谈一个比赛中用到的小技巧。
这个比赛数据中有一个特征叫做 "item_description",大致是一些商品描述,比如什么时候买的、新旧程度如何、什么牌子的等等。因为大部分都是Mercari这个网站(这个类似于国内的二手商品交易网站)上的用户自己填的商品描述,所以是极尽杂乱之能事,会出现很多夸张的符号,比如这样:
另外的一大问题是用语规范不统一,比如 $1.100 和 $1.1 其实是一个意思,然而在对文本进行特征提取时就会被当成两个特征,这会使特征变得过于稀疏,对模型的效果也会产生影响。所幸Pandas中提供了str.replace()这个方法,可以高效处理此类问题。
str.replace()的作用基本与re.sub()等同,区别在于re.sub()一次只能处理一个字符串,而str.replace()可以一次处理一整个Series,因而效率要高很多。str.replace()的正式形式为 Series.str.replace(pat, repl)[2] ,其中pat为想要寻找的模式,一般为正则表达式,repl为要替换进去的字符串或函数。
下面是几个简单的例子,X代表一个Series,repl皆为字符串:
X.str.replace(r"iphones+7", "iphone7") #为了将iphone7视为一个词,把iphone 7转换为iphone7,去除空格。 X.str.replace(r"16gbiphone", "16gb iphone") #将16gbiphone转换无16gb iphone,增加空格。 X.str.replace(r"fls?.?s?oz", "floz") #将fl.oz或fl . oz转换为floz如果是一些比较复杂的情况,则需要将repl自定义为函数:
1) 将1.101000变为1.101,即将后面的"0"去掉。
remove0 = lambda m:m.group(0).rstrip("0") X.str.replace(...