Products
GG网络技术分享 2025-03-18 16:15 5
替换前
https://www.123.com/abc/381959786/xyz/2359824672https://www.123.com/abc/310861904/xyz/2397886336https://www.123.com/abc/28021901/xyz/2575570645https://www.123.com/abc/29001914/xyz/2655252812https://www.123.com/abc/432375183/xyz/2660525016https://www.123.com/abc/26590963/xyz/2549838667https://www.123.com/abc/310861904/xyz/2639950518
替换后
https://www.123.com/abc/381959786https://www.123.com/abc/310861904https://www.123.com/abc/28021901https://www.123.com/abc/29001914https://www.123.com/abc/432375183https://www.123.com/abc/26590963https://www.123.com/abc/310861904
也就是查找"/xyz/2397886336"特征结构的文本内容,将其替换为空
我的环境是emeditor编辑器
s为字符串,试试
ret = re.sub(r'/xyz/\\d+', "", s)
print(ret)
爱数课:http://idatacourse.cn
领域:其他
简介:本次案例是从当当网图书网站爬取下来的关于机器学习的数据,在本次案例中我们进行数据的处理,如增加、删除和修改等操作,已满足我们所需要的信息。
数据:
./dataset/data.csv
./dataset/星级.jpg
本案例的数据集来自某图书网站爬取的机器学习相关的图书信息,数据集链接:http://idatascience.cn/dataset-detail?table_id=2
数据集中共有600条数据,5个字段,其中各个字段的含义如下:
数据集保存在csv文件中,使用Pandas中的read_csv()
函数读取csv文件,结果会保存为一个DataFrame或Series对象,使用DataFrame或Series对象的head()
方法可以查看前行数据,默认为5。
#导入相关的库importpandasaspd
importnumpyasnp
#读取数据
data=pd.read_csv("./dataset/data.csv",encoding='utf-8',sep='\\t')
#查看数据
data['星级'].value_counts()
调用DataFrame对象的info()
方法,获取数据集的列名,非空值个数,列数据类型,内存占用等信息。
data._____
可以看出数据集索引为0到599,共600条数据。各个字段均没有空值,不需要进行缺失值处理。各个字段的数据类型均为字符型。
由于当前价格
这一列中包含'¥' 符号,如果我们想对图书价格进行统计以及可视化分析,则需要从当前价格
中提取出价格的数值。我们可以使用正则表达式的方法完成上述操作。正则表达式(Regular Expression)使用单个字符串来描述和匹配一系列符合某个句法规则的字符串,常见的正则表达式如下所示。re库是Python中正则表达式的支持库。使用re中的findall()
函数将当前价格
中的数值提取出来,保存为新的一列当前价格_match
。findall()
函数返回字符串中所有与正则表达式匹配的全部字符串,返回形式为数组。
+
将前面的模式匹配一次或者多次
?
该符号匹配前一个字符零次或一次
*
将前面的模式匹配0次或多次
.
匹配除换行符以外的任意字符
\\
转译字符
\\d
匹配数字0-9
\\d{n}
匹配正好为n位数的数字
\\d{n,}
匹配至少为n位数的数字
\\d{m,n}
匹配m-n位数的数字
[A-Za-z]+
匹配英文字母组成的字符串
[A-Za-z0-9]+
匹配由数字和英文字母组成的字符串
DataFrame对象中的apply
方法可以将某个函数应用到由列或行形成的Series对象上。首先定义一个函数num_func
,用于提取价格数值,然后使用apply
方法将num_func
应用于当前价格
这一列上。
data['当前价格']
importre
#利用正则表达式,将当前价格一列只读取数字部分并创建新的一列deffunc(data):
result=__________
returnfloat(result[0])
data['当前价格_match']=data['当前价格'].apply(func)
data.head(3)
由于评论数
这一列中不仅包含评论数值,还包括一些文字,如果我们想对评论的数量进行统计以及可视化分析,则需要从评论数
这一列当中提取出评论的数值。利用正则表达式将评论数中的数值提取出来,保存为新的一列评论数_match
。
data['评论数']
importre#定义读取评论数的函数
deffunc_1(data):
result=__________
returnint(result[0])
#利用apply方法,将每一条数据进行处理
data['评论数_match']=data['评论数'].apply(func_1)
#查看是否处理成功data.head(3)
同样星级
这一列中不仅包含数值,还包括一些其他的字符,如果我们想对图书的星级进行统计以及可视化分析,则需要从星级
这一列当中提取出星级的数值。利用正则表达式将星级中的数值提取出来。原网站中,利用星级对图书进行评价,图书星级最高用五颗星来进行表示,且可用半颗星进行表示。我们将星级的数值转换到[0,5]
的区间内,保存为新的一列星级_match
,方便我们后续对数据集进行可视化等操作。
#提取星级数data['星级_match']=data['星级'].apply(func_1)
data.head(3)
#将星级除以20,取值范围转换到[0,5]的区间内data['星级_match_cal']=data['星级_match'].apply(______)
data.head(3)
接下来我们处理出版信息
这一列,从原始数据中可以看到,这一列主要包含三个信息,分别是作者、出版日期、出版社。我们将出版信息
按照/
分割成三部分,分三列单独存放,列名分别为作者、出版日期和出版社。字符串对象的split
方法通过指定分隔符对字符串进行切片。
data['出版信息'][:5]
#将出版信息分割成三列,分别提取出作者、出版日期和出版社#提取出作者
data['作者']=data['出版信息'].apply(__________)
data.head(3)
提取出的出版时间为字符串对象,我们可以通过datetime库中datetime模块的strptime函数将字符串转换为datetime时间类型对象。
#用正则表达式提取日期,并将日期字符串转换成日期格式fromdatetimeimportdatetime
deffunc_2(data):
result=re.findall(__________)
iflen(result)<1:
returnNone
else:
returndatetime.strptime(_____,_____)#返回日期类型
#提取日期,并添加为新的一列
data['出版日期']=data['出版信息'].apply(func_2)
data.head(3)
#提取出版社一列,并添加为新的一列data['出版社']=data['出版信息'].apply(_____________)
#查看结果
data.head(3)
书名字段包含书名和书籍的相关介绍。【】
和[]
之间的内容一般是图书的标注信息,我们可以用空格将其进行替换。剩余的内容中书名和其他内容基本是由空格隔开的,所以我们以空格为分隔符,对字段进行分割,提取图书的书名和简介部分。
data['书名'][:5]
#将'【】'和'[]'以及之间的内容,用空格来代替deffunc_3(data):
data=data.strip()#先去除头和尾的空格
data=re.sub("【.*?】","",data)
data=re.sub("\\[.*?\\]","",data)
returndata.split("")
data['书名_split']=data['书名'].apply(func_3)data['书名_split'][:5]
#提取书名data['书名_split_1']=data['书名_split'].apply(lambdax:x[0])
data['书名_split_1'][:5]
#因为分割后的字段长度不唯一,所以从第三个开始我们要先判定每个字段分割后的长度,之后再进行提取#提取简介1
data['书名_split_2']=data['书名_split'].apply(lambdax:Noneiflen(x)<=1elsex[1])
data['书名_split_2'][:5]
#提取简介2data['书名_split_3']=data['书名_split'].apply(lambdax:Noneiflen(x)<=2elsex[2])
data['书名_split_3'][:5]
data.head(3)
使用DataFrame对象的drop
方法删除不需要的列。
#删除不需要的列data.drop(['书名','出版信息','当前价格','星级','评论数','星级_match','书名_split'],_________)
data.head(3)
使用DataFrame对象的rename
对列进行重命名。
#修改列名data.rename(columns={'当前价格_match':'当前价格','评论数_match':'评论数','星级_match_cal':'星级','书名_split_1':'书名','书名_split_2':'简介1','书名_split_3':'简介2'},___________)
data.head(3)
使用DataFrame对象的to_csv
方法将处理好的数据保存为CSV文件。
data.to_csv('当当网机器学习图书数据(已清洗).csv', sep=',',encoding='utf8',index=False)
通过本案例我们了解了数据读取的方法,了解了一些常用的正则表达式,学习了数据清洗的基本操作,包括用正则表达式的方式匹配相应的字符串,用split()
方法按照指定字符对字符串进行分割,用replace()
方法进行字符串的替换。将原始数据集经过数据清理,处理成适用于建模、计算和可视化分析的数据。
爱数课(iDataCourse)是一个面向院校的大数据和人工智能课程和资源平台。平台提供权威的课程资源、数据资源、案例实验资源,助力院校大数据和人工智能专业建设,课程建设和师资能力建设。
爱数课实验 | 非洲国家金融危机预测分析
爱数课实验 | 西班牙房价预测模型构建
爱数课实验 | 飞机失事事故探索
爱数课实验 | 中文商品评论情感判定
爱数课实验 | 汽车款式聚类
爱数课实验 | 使用线性判别分析来预测客户流失
爱数课实验 | 金融贷款数据可视化
爱数课实验 | 使用 PageRank 对全球机场进行排序
爱数课实验 | 首尔共享自行车需求数据可视化分析
爱数课实验 | 商业拍卖诈骗识别
爱数课实验 | 台湾地区信用卡客户贷款违约预测
爱数课实验 | 利用Python爬取股票交易数据
爱数课实验 | 墨西哥人肥胖程度数据可视化分析
爱数课实验 | 利用Python对奥斯卡金像奖得主数据进行数据清洗
爱数课实验 | 印度肝病患者智能诊断
爱数课实验 | 利用机器学习模型预测美国州际公路交通量
爱数课实验 | 中学生数学成绩可视化分析
Demand feedback