1.pandas中强制类型转换
场景:在爬虫获取完成数据并且写入csv文件中后,读取数据发现数据类型是object类型。object类型是泛类型数据,在未进行强制转换前,price无法参与运算并且报错(unsupported operand type(s) for /: ‘str’ and ‘int’),原因是price中的非浮点型数据导致报错。而脏数据的产生是因为爬虫爬取过程中,由于ajax加载慢而导致。
刚开始想尝试astype方法进行强制类型转换,但是由于有字符串数据存在,所以无法使用。
sourceData['price'] = sourceData['price'].astype(float)
报错:could not convert string to float
还有一种情况是将浮点型转换成字符串类型,这样直接使用astype(str)即可
经过查阅,这里要使用另外一种强制类型转换的方法:
sourceData['price'] = pd.to_numeric(sourceData['price'], errors='coerce')
pandas.to_numeric(arg, errors=‘raise’, downcast=None)
将参数转换为数字类型。默认返回dtype为float64或int64, 具体取决于提供的数据。使用downcast参数获取其他dtype。如果传入非常大的数字,则可能会导致精度损失。这里将errors置为‘coerce’,是将字符串设置为NaN,经过转换后就变成了float64类型的数据了~
2.过滤掉文本中的中文
场景:在获取网页源码的过程中,由于emoji表情或者是其他的标点符号导致csv文件文本中出现乱码,由于我需要对所有的评论进行分词处理,所以需要过滤掉这些中文乱码。
使用的是python内置函数ord(),因为中文的Unicode数值会超过256,而且ord()不会对空格产生影响,所以有了以下代码(当然也希望你能有更好的方法):
def filter_zh(reviews):
s = ''
for i in reviews:
if ord(i)>256:
i = ' '
s += i
return s
3.pandas中筛选需要的值,和过滤掉不需要的字段。
场景:在很多商品标题中,拿口红为例子,有dior 有 ysl 有 mac等等,那我们要怎么根据自己的需求筛选出来呢?
筛选需要的数据(只需要mac):
word = 'mac'
# case = False则不忽略大小写
df = sourceData.loc[sourceData['title'].str.contains(word, case=False)]
过滤掉标题中不需要的色号:
color = '925'
colorData = sourceData.loc[sourceData['title'].str.contains(color, case=False)]
colorList = colorData['title'].tolist()
df = sourceData[~sourceData['title'].isin(colorList)]
这样就可以快速的过滤掉不要的数据了,之前过滤的话我是使用相加去重的方法,感觉会更麻烦。
如果有更好的方法!欢迎留言!!
4.由于数据类型引发的惨案:在对数据比较大小时没有将数据转换成int或者float类型。
场景:在写爬虫程序的时候有时候为了方便,会将一些数据处理过后再写入,但是在爬取了一周的数据后,发现数据不对,检查发现,程序处理数据出现了问题。所以建议对在爬去数据前对数据检查无误后再去爬取数据。
首先获取到的数据是字符串类型的,
“16 * 12 * 3.5 inches”
,分表代表长宽高,
我需要得到长和宽计算画布的面积,
但是由于这个数据是卖家自己填写,
有时候是高长宽“3.5 * 16 * 12 inches”
,
首先需要替换掉inches和*使用replace方法即可,然后使用split切片,
split切片后返回了一个列表,
然后使用min()函数找出最小值然后再remove掉就可以得到长和宽。
可是就是在这里!!在切片后没有进行将字符串类型转换成浮点型,导致min()函数判断出来的最小值不是3.5,以至于很多获取下来的尺寸都是不对的…
这些小方法就分享到这里,后续如果有更好的方法以及更多的案例,会积极分享给大家。