Python综合实战案例-数据清洗分析

写在前面:
本次是根据前文讲解的爬虫、数据清洗、分析进行的一个纵隔讲解案例,也是对自己这段时间python爬虫、数据分析方向的一个总结。

本例设计一个豆瓣读书数据⽂件,book.xlsx⽂件保存的是爬取豆瓣⽹站得到的图书数据,共 60671 条。下⾯进⾏探索性数据分析。
在这里插入图片描述

文章目录

  • 一、清洗爬取的网站数据
    • 1. 导入数据
    • 2、清洗方法
    • 3. 处理页数数据
    • 4.处理价格数据
    • 5.处理评论数量数据
  • 二、分析爬取的网站数据
    • 1.处理出版时间
    • 2.分析图书数量与年份的关系
    • 3.分析图书评分与年份的关系
    • 4.分析图书价格分布情况
    • 5.出版图书最多的top20出版社
    • 6. 图书评分较高的出版社
    • 7. 出书较多的作者
    • 8.分析评论和评论数量的关系
    • 9.分析评分与评论数量的关系2

一、清洗爬取的网站数据

1. 导入数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', **{'family':'SimHei'})
# 导⼊数据
df = pd.read_excel('books.xlsx')
# 删除第9列
df = df.drop('Unnamed: 9', axis=1)     

2、清洗方法

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', **{'family':'SimHei'})
# 导⼊数据
df = pd.read_excel('books.xlsx')
# 删除第9列
df = df.drop('Unnamed: 9', axis=1)# 对数据做清洗(缺失值与异常值)
df.describe()
df.info()
df.dtypes
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60671 entries, 0 to 60670
Data columns (total 9 columns):
书名      60671 non-null object
作者      60668 non-null object
出版社     60671 non-null object
出版时间    60671 non-null object
页数      60671 non-null object
价格      60656 non-null object
ISBN    60671 non-null object
评分      60671 non-null float64
评论数量    60671 non-null object
dtypes: float64(1), object(8)
memory usage: 2.3+ MB
"""           

3. 处理页数数据

⽬前只要评分是数值型数据,我们还要将⻚数、价格、评论数量转换成数值型数据。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', **{'family':'SimHei'})
# 导⼊数据
df = pd.read_excel('books.xlsx')
# 删除第9列
df = df.drop('Unnamed: 9', axis=1)# 对数据做清洗(缺失值与异常值)
df.describe()
df.info()
df.dtypesprint("---------------------------------")
# 前期分析print( df['页数'].describe() )
'''
count     60671
unique     2109
top        None
freq       4267
Name: 页数, dtype: object
'''
print(  df['页数'].isnull().sum() ) # 返回:0 ,这样看不出来
print( len(df[df['页数']=='None']) ) # 返回:4267 , 看看有多少 None 值页数信息print("---------------------------------")# 转换# 定义 convert_to_int ⽅法处理页数数据,如果为 None 则填充 0
import re
def convert2int(x):if re.match('^\d+$',str(x)):return xelse:return 0df['页数'] = df['页数'].apply(convert2int)'''
# 或者⽤ lambda 表达式
df['页数'] = df['页数'].apply(lambda x: x if re.match('^\d+$', str(x)) else 0)
df['页数'] = df['页数'].astype(int)'''print( df['页数'].describe() )
'''
count    6.067100e+04
mean     6.883281e+06
std      1.695365e+09
min      0.000000e+00
25%      1.940000e+02
50%      2.640000e+02
75%      3.600000e+02
max      4.175936e+11
Name: 页数, dtype: float64
'''
print(  df['页数'].isnull().sum() ) # 返回:0 
print( len(df[df['页数']=='None']) ) # 返回:0 

4.处理价格数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', **{'family':'SimHei'})
# 导⼊数据
df = pd.read_excel('books.xlsx')
# 删除第9列
df = df.drop('Unnamed: 9', axis=1)# 对数据做清洗(缺失值与异常值)
df.describe()
df.info()
df.dtypesprint("---------------------------------")
# 处理价格数据df['价格'] = df['价格'].apply(lambda x: x if re.match('^[\d\.]+$', str(x)) else 0)
df['价格'] = df['价格'].astype(float)
# 价格为 0 的图书数量
print( len(df[df['价格'] == 0]) )   # 3217 

5.处理评论数量数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', **{'family':'SimHei'})
# 导⼊数据
df = pd.read_excel('books.xlsx')
# 删除第9列
df = df.drop('Unnamed: 9', axis=1)# 对数据做清洗(缺失值与异常值)
df.describe()
df.info()
df.dtypesprint("---------------------------------")
# 处理评论数量数据
df['评论数量'] = df['评论数量'].apply(lambda x: x if re.match('^\d+$', str(x)) else 0)
df['评论数量'] = df['评论数量'].astype(int)print( df.dtypes )
'''
书名       object
作者       object
出版社      object
出版时间     object
页数        int64
价格      float64
ISBN     object
评分      float64
评论数量      int32
dtype: obje
'''

二、分析爬取的网站数据

1.处理出版时间

后⾯需要⽤到年份信息,这⾥先对年份信息进⾏加⼯:处理出版时间,只要年份。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', **{'family':'SimHei'})
# 导⼊数据
df = pd.read_excel('books.xlsx')
# 删除第9列
df = df.drop('Unnamed: 9', axis=1)# 对数据做清洗(缺失值与异常值)
df.describe()
df.info()
df.dtypes# 处理⻚数数据
# 定义 convert_to_int ⽅法处理页数数据,如果为 None 则填充 0
import re
def convert2int(x):if re.match('^\d+$',str(x)):return xelse:return 0
df['页数'] = df['页数'].apply(convert2int)# 处理价格数据
df['价格'] = df['价格'].apply(lambda x: x if re.match('^[\d\.]+$', str(x)) else 0)
df['价格'] = df['价格'].astype(float)# 处理评论数量数据
df['评论数量'] = df['评论数量'].apply(lambda x: x if re.match('^\d+$', str(x)) else 0)
df['评论数量'] = df['评论数量'].astype(int)print("---------------------------------")# 处理出版时间,只要年份
def year(s):y = re.findall('\d{4}',str(s))if len(y)>0:return y[0]return ''df['出版年份'] = df['出版时间'].apply(year)
# 看看还有多少没有年份信息的
print( len(df[df['出版年份'] == '']) )   # 返回: 1035

2.分析图书数量与年份的关系

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")# 按出版年份进⾏分组
grouped = df.groupby('出版年份')
data = grouped['ISBN'].count()
# 有两条数据⽐较奇怪,处理⼀下
df[df['出版年份'] == '1979']
df.loc[df.index[60632], ['书名', '出版时间', '出版年份']]
"""
书名 鲁迅作品中的绍兴⽅⾔注释
出版时间 1979/初版印
出版年份 1979
Name: 60632, dtype: object
"""
df.loc[df.index[60632], ['出版年份']] = '1979'
df[df['出版年份'] == '2002']
df.loc[df.index[4544], ['书名', '出版时间', '出版年份']]
"""
书名 俄罗斯插画作品集
出版时间 2002/2
出版年份 2002
Name: 4544, dtype: object
"""
df.loc[df.index[4544], ['出版年份']] = '2002'# 然后按”出版年份“进⾏分组
grouped = df.groupby('出版年份')
data = grouped['ISBN'].count()
print( data )print("---------------------------------")# 判断前7条数据和后4条数据属于异常数据,所以删除前7后4的数据
data2 = data[7:-4]
# 准备画图,设置宽⼀点
plt.figure(figsize=(15, 5))
# 设置 x 周标签的倾斜⻆度
plt.xticks(rotation=60)
plt.xlabel('年份')
plt.ylabel('图书数量')
plt.plot(data2.index, data2.values)
plt.show()

在这里插入图片描述

3.分析图书评分与年份的关系

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")# 按出版年份进⾏分组
grouped = df.groupby('出版年份')
data = grouped['ISBN'].count()
# 有两条数据⽐较奇怪,处理⼀下
df[df['出版年份'] == '1979']
df.loc[df.index[60632], ['书名', '出版时间', '出版年份']]
"""
书名 鲁迅作品中的绍兴⽅⾔注释
出版时间 1979/初版印
出版年份 1979
Name: 60632, dtype: object
"""
df.loc[df.index[60632], ['出版年份']] = '1979'
df[df['出版年份'] == '2002']
df.loc[df.index[4544], ['书名', '出版时间', '出版年份']]
"""
书名 俄罗斯插画作品集
出版时间 2002/2
出版年份 2002
Name: 4544, dtype: object
"""
df.loc[df.index[4544], ['出版年份']] = '2002'# 然后按”出版年份“进⾏分组
grouped = df.groupby('出版年份')
data = grouped['ISBN'].count()
print( data )print("---------------------------------")data3 = grouped['评分'].mean()
data3 = data3[7:-4]
# 折线图反映年份和评分之间的关系
# 设置宽⼀点
plt.figure(figsize=(15, 5))
# 设置 x 周标签的倾斜⻆度
plt.xticks(rotation=60)
plt.xlabel('出版年份')
plt.ylabel('评分')
plt.plot(data3.index, data3.values)
# 还要画均值线
m = data3.values.mean()
plt.plot(data3.index, [m]*len(data3.index))
plt.show()

在这里插入图片描述

4.分析图书价格分布情况

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")df2 = df[df['价格'] > 0]
# 看看有多少价格⼤于0的
len(df2)
df2['价格'].describe()
# 直⽅图显⽰图书价格分布情况
plt.figure(figsize=(15, 5))
plt.hist(df2['价格'], bins=40, range=(0, 200), rwidth=0.8)
plt.show()

在这里插入图片描述

5.出版图书最多的top20出版社

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")# 出版书籍最多的20个出版社
data4 = df.groupby('出版社')['ISBN'].count()
plt.figure(figsize=(15, 5))
plt.title('⾼产出版社 Top20')
# 最多的是 None,要去掉,所以选择 -21:-1
data4.sort_values()[-21:-1].plot(kind='bar')
plt.show()

在这里插入图片描述

6. 图书评分较高的出版社

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")# 评分较⾼的出版社
plt.figure(figsize=(15, 5))
plt.title('好评出版社 Top20')
data5 = df.groupby('出版社')['评分'].mean()
data5.sort_values()[-20:].plot(kind='bar')
plt.show()

在这里插入图片描述

7. 出书较多的作者

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")# 出书较多的作者
plt.figure(figsize=(15, 5))
plt.title('作者 Top20')
data6 = df.groupby('作者')['ISBN'].count()
data6.sort_values()[-21:-1].plot(kind='bar')
plt.show()

在这里插入图片描述

8.分析评论和评论数量的关系

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")print( df.corr() )
'''页数        价格        评分      评论数量
页数    1.000000 -0.000030  0.003157 -0.000658
价格   -0.000030  1.000000  0.001443 -0.001673
评分    0.003157  0.001443  1.000000  0.063536
评论数量 -0.000658 -0.001673  0.063536  1.000000
'''

9.分析评分与评论数量的关系2

# 与上面示例源代码相同,这里省略print("---------------------------------")
print("---------------------------------")# 评分⾼低与评论数量之间是否存在某种关系
# 当系统中安装多个Python版本时,可能存在无法导入问题,可以使用下面2行代码,指定要加载的seaborn文件所在的路径。
# 如果不存在加载问题,可以删除下面2行代码。
import sys
sys.path.append('C:\ProgramData\Anaconda3\Lib\site-packages')
# 加载seaborn
'''
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,
在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。
应该把Seaborn视为matplotlib的补充,而不是替代物。
同时它能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。
'''
import seaborn as sns
# 计算相关性矩阵
corr = df.corr()
sns.heatmap(corr, cmap=sns.color_palette('Blues'))
plt.show()

在这里插入图片描述

写在最后:希望大家可以学到用到,多多支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/285471.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞芯微RK3576|触觉智能:开启科技新篇章

更多产品详情可关注深圳触觉智能官网&#xff01; “瑞芯微&#xff0c;创新不止步&#xff01;”——全新芯片RK3576即将震撼登场。指引科技风潮&#xff0c;创造未来无限可能&#xff01;这款芯片在瑞芯微不断创新和突破的道路上&#xff0c;不仅是对过往成就的完美延续&…

填补市场空白,Apache TsFile 如何重新定义时序数据管理

欢迎全球开发者参与到 Apache TsFile 项目中。 刚刚过去的 2023 年&#xff0c;国产开源技术再次获得国际认可。 2023 年 11 月 15 日&#xff0c;经全球最大的开源软件基金会 ASF 董事会投票决议&#xff0c;时序数据文件格式 TsFile 正式通过&#xff0c;直接晋升为 Apache T…

基于傅里叶描述子的手势动作识别,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

AI之Suno:Suno V3的简介、安装和使用方法、案例应用之详细攻略

AI之Suno&#xff1a;Suno V3的简介、安装和使用方法、案例应用之详细攻略 目录 Suno AI的简介 1、特点与改进&#xff1a; Suno AI的安装和使用方法 1、第一步&#xff0c;让国产大模型—ChatGLM4帮我写一个提示词 2、第二步&#xff0c;将提示词交给Suno v3&#xff0c;…

阿里云倚天服务器是什么?倚天服务器c8y、g8y和r8y详细介绍

阿里云倚天云服务器CPU采用倚天710处理器&#xff0c;租用倚天服务器c8y、g8y和r8y可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持&#xff1a; 阿里云倚天云服务…

FastAPI+React全栈开发02 什么是FARM技术栈

Chapter01 Web Development and the FARM Stack 02 What is the FARM stack and how does it fit together? FastAPIReact全栈开发02 什么是FARM技术栈 It is important to understand that stacks aren’t really special, they are just sets of technologies that cover…

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制&#xff0c;包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏&#xff0c;非待机&#xff0c;并黑屏后点击触摸屏可以唤醒屏幕&#xff0c;可以借助 xrandr 命令来实现。 首先&#xff0c;…

docker 本地机 互通文件

查询容器name 查询容器Id 进行传输

从相机空间到像素空间的投影和反投影原理和代码

目录 从相机空间到像素空间的投影 效果 ​编辑 公式 ​编辑 代码 像素空间到相机空间的反投影 记录一下从相机空间到像素空间的投影&#xff08;3D-->2D&#xff09;和像素空间到相机空间的反投影&#xff08;2D-->3D&#xff09;。 推荐blog&#xff1a;SLAM入门之视…

WSL下Ubuntu+RTX4090安装CUDA+cuDnn+Pytorch

安装驱动 首先需要明确的是&#xff0c;在WSL下安装Ubuntu&#xff0c;如果要使用主机的GPU卡&#xff0c;只需要在主机Windows上安装驱动&#xff0c;Linux中不需要安装驱动&#xff0c;可以在Linux中使用nvidia-smi命令查看驱动版本。 安装CUDA 避坑注意事项&#xff1a;如…

【框架】说一说 Fork/Join?

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习Java框架 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助 目录 前言 什么是 Fork&#xff1f; 什么是 Join&#xff1f; Fork/Join 的核心组件 F…

流畅的 Python 第二版(GPT 重译)(二)

第三章&#xff1a;字典和集合 Python 基本上是用大量语法糖包装的字典。 Lalo Martins&#xff0c;早期数字游牧民和 Pythonista 我们在所有的 Python 程序中都使用字典。即使不是直接在我们的代码中&#xff0c;也是间接的&#xff0c;因为dict类型是 Python 实现的基本部分。…

酷开系统让用户和电视双向传递,酷开科技实现商业变现

电视在我们的日常生活中扮演着重要的角色。虽然&#xff0c;作为客厅C位的扛把子——电视的娱乐作用深入人心&#xff0c;但是&#xff0c;它的涵义和影响力却因我们每个人的具体生活环境而存在着种种差异&#xff0c;而我们的生活环境又受到我们所处的社会及文化环境的影响。 …

毕业设计:日志记录编写(3/17起更新中)

目录 3/171.配置阿里云python加速镜像&#xff1a;2. 安装python3.9版本3. 爬虫技术选择4. 数据抓取和整理5. 难点和挑战 3/241.数据库建表信息2.后续进度安排3. 数据处理和分析 3/17 当前周期目标&#xff1a;构建基本的python环境&#xff1a;运行爬虫程序 1.配置阿里云pytho…

B端设计:如何让UI组件库成为助力,而不是阻力。

首发2023-09-24 15:42贝格前端工场 Hi&#xff0c;我是大千UI工场&#xff0c;网上的UI组件库琳琅满目&#xff0c;比如elementUI、antdesign、iview等等&#xff0c;甚至很多前端框架&#xff0c;也出了很多UI组件&#xff0c;如若依、Layui、bootstrap等等&#xff0c;作为U…

工具分享丨分析GreatSQL Binglog神器

在GreatSQL中&#xff0c;Binlog可以说是 GreatSQL 中比较重要的日志了&#xff0c;在日常开发及运维过程中经常会遇到。Binlog即Binary Log&#xff0c;二进制日志文件&#xff0c;也叫作变更日志&#xff08;Update Log&#xff09;。 详细Binglog日志介绍 Binglog主要应用…

包含多个段的程序

文章目录 包含多个段的程序在代码段中使用数据在代码段中使用栈将数据、代码、栈放入不同的段 包含多个段的程序 在代码段中使用数据 考虑这样一个问题&#xff0c;编程计算以下8个数据的和&#xff0c;结果存在ax 寄存器中&#xff1a;0123H&#xff0c;0456H&#xff0c;07…

性能测试-Jmeter中IF控制器使用

一、Jmeter控制器 分为两种类型&#xff1a; 控制测试计划执行过程中节点的逻辑执行顺序&#xff0c;如&#xff1a;循环控制器&#xff0c;if控制器等对测试计划中的脚本进行分组&#xff0c;方便Jmeter统计执行结果以及进行脚本的运行时控制等&#xff0c;如&#xff1a;吞…

Mysql数据库的SQL语言详解

目录 一、数据库的基础操作 1、数据库的基本查看和切换 1.1 查看数据库信息 1.2 切换数据库 1.3 查看数据库中的表信息 1.4 查看数据库或数据库中表的结构&#xff08;字段&#xff09; 1.5 数据类型 1.5.1 整数型 1.5.2 浮点型(float和double) 1.5.3 定点数 1.5.4…

【郭林保大夫】——这些事情做到了,想患上帕金森都难!

郭林保大夫说&#xff1a;帕金森病的发病原因尚不完全清楚&#xff0c;但可能与多种因素有关&#xff0c;包括遗传因素、环境因素、神经系统老化等。具体病因可能是这些因素相互作用的结果。病情后期&#xff0c;严重程度会因个体差异而异。一些患者可能出现严重的运动障碍&…