第十二篇:复习python数据清洗

一、啥是数据清洗

数据处理和清洗是数据科学和机器学习领域中的重要环节,它们涉及到数据的预处理、转换、清理和整理等工作。在现实生活中,数据通常是不完美的,可能包含错误、缺失值、重复值等问题,因此需要进行数据处理和清洗。Python是一个非常流行的编程语言,它提供了许多强大的库来帮助我们进行数据处理和清洗,例如pandas、numpy、sklearn等。

二、将表格数据导入pandas中

1. 准备工作

请添加图片描述
下载以上文件,并准备好测试数据
我分别放在了

  • chapter01:在C盘——用户——Administrator——AAAAAAAAAA——data 数据内
  • EditPlus:在电脑E盘EditPlus中
  • Anaconda3:在C盘——ProgramData——Anaconda3中

准备好上面的工具之后在,开始界面单击开始,

在这里插入图片描述
然后会出现一个这个页面(显示的内容和——文件资源管理器——C盘——用户——Administrator这个文件夹下面的内容是一样的,可以在文件夹中创建一个文件夹,如果页面同步更新,说明操作无误):
在这里插入图片描述

然后右上角new——选择python3即可
在这里插入图片描述




2. 引入csv文件

2.1 引入pandas库

导入pandas库并设置环境,更轻松地查看输出

import pandas as pd
pd.options.display.float_format = '{:,.2f}'.format	#保留两位小数
pd.set_option('display.width',85)	#展示的宽度
pd.set_option('display.max_columns',8)	#展示的最大列数

2.2 读取文件/修改名称

读取文件,为标题设置新名称,然后解析日期列。
将skiprows参数设置为1,以跳过第一行,将列的列表传递给parse_dates以从这些列中创建一个Pandas日期时间列,并将low_memory参数设置为False,以减少过程中的内存使用量

代码如下:

landtempssample = pd.read_csv(r'data/landtempssample.csv',
names=['stationid','year','month','avgtemp','latitude',
      'longitude','elevation','station','countryid','country'],
        skiprows=1,	#跳过第一行
        parse_dates=[['month','year']],
        low_memory=False)	#低内存运行
type(landtempssample)

运行效果:

在这里插入图片描述

3.2 快速浏览数据

使用head查看前几条数据,显示所有列的数据类型以及行和列的数量

查看前几行数据:

landtempssample.head(7)

效果如下:
在这里插入图片描述
查看行和列的类型:

landtempssample.dtypes

效果如下:
在这里插入图片描述
查看行和列的数量:

landtempssample.shape

效果如下:
在这里插入图片描述

2.4 修改名字

把日期列修改一个更好的名字,并且查看月份平均温度的摘要统计信息

landtempssample.rename(columns={'month_year':'measuredate'},inplace = True)
landtempssample.dtypes
landtempssample.avgtemp.describe()

效果如下:在这里插入图片描述

2.5 查找缺失值

使用isnull可以为每个列中的每个缺失值返回True,而在没有缺失值时返回False
将isnull和sum链接在一起时即可计算每一列中的缺失值数

landtempssample.isnull().sum()

具体效果如下:
在这里插入图片描述

2.6 删除缺失值

使用subset参数高速dropna删除avgtemp列包含缺失值的行,将inplace设置为True

landtempssample.dropna(subset=['avgtemp'],inplace=True)
landtempssample.shape

效果如下:
在这里插入图片描述




3. 引入Excel文件

3.1 引入pandas库

import pandas as pd

3.2 读取Excel文件的人均GDP数据

选择包含所需的数据的工作表,但跳过不需要的行和列,使用sheet_name参数即可指定工作表,将skiprows设置为4,skipfooter设置为1,以跳过前四行,和最后一行。设置usecols参数的值,以获取A列,从列到T列的数据

实例如下:

percapitaGDP = pd.read_excel('data/GDPpercapita.xlsx',
sheet_name = "OECD.Stat export",
skiprows = 4,# 跳过前四行
skipfooter = 1,# 跳过最后一行
usecols = "A,C:T")# 展示的列为A列和C—T列

percapitaGDP.head()# 展示前五行

运行结果如下:
在这里插入图片描述

3.3 查看数据类型和non-null值计数

使用DataFrame的info方法,查看数据类型和non-null值计数:

实例:

percapitaGDP.info()

在这里插入图片描述

3.4 重命名并删除空格

将Year列重命名为metro,并且检查前导空格用startswith(‘’),使用endswith(‘’)检查后导空格,判断是否存在空格用any(),如果有就使用strip来删除前导和后导空格

重命名

percapitaGDP.rename(columns={'year':'metro'},inplace=True)

测试前导空格

percapitaGDP.metro.str.startswith('').any()

测试后导空格

percapitaGDP.metro.str.endswith('').any()

删除前导和末尾空格

percapitaGDP.metro = percapitaGDP.metro.str.strip()

具体如下:

在这里插入图片描述

3.5 数据类型转换

把所有年份的GDP年份列(2001-2018),并将数据类型从object转换为float,即使存在字符数据,也强制转换(目的是为了让这些字符串变为缺失值)最后,重命名年份列,为了更好地展示数据

具体如下:

for col in percapitaGDP.columns[1:]:
    percapitaGDP[col] = pd.to_numeric(percapitaGDP[col],errors='coerce')
    percapitaGDP.rename(columns={col:'pcGDP'+col},inplace = True)
percapitaGDP.head()

效果如下:
在这里插入图片描述
使用dtypes检查一下:

percapitaGDP.dtypes

在这里插入图片描述

3.6 摘要统计信息

使用describe为表中所有数字数据生成摘要统计信息

percapitaGDP.describe()

运行结果如下:

在这里插入图片描述

3.7 删除缺失值

  1. 使用dropna的subset参数检查所有列
  2. 使用how指定仅当subset所有列缺失时才删除行
  3. 最后使用shape显示结果行数和列数
percapitaGDP.dropna(subset = percapitaGDP.columns[1:],how="all",inplace = True)
percapitaGDP.describe()

具体如下:在这里插入图片描述

percapitaGDP.head()

如下图:
在这里插入图片描述
最后用shape显示行数列数

percapitaGDP.shape

运行如下:
在这里插入图片描述

3.8 设置索引

使用metro列设置索引
在设置索引之气那,确认metro列有480个有效值,并且有480个唯一值

percapitaGDP.metro.count()# 480个有效值

percapitaGDP.metro.nunique()#480个唯一值

运行如下:

在这里插入图片描述
设置索引(并且输出检查一下):

percapitaGDP.set_index('metro',inplace = True)
percapitaGDP.head()

在这里插入图片描述
最后从表格查取数据:

percapitaGDP.loc['AUS02: Greater Melbourne']

效果如下:
在这里插入图片描述
到此!,已经把Excel数据成功导入到Pandas DataFrame中,并且清除了表格中的混乱数据

4. 引入sql文件

4.1 导入模块

导入pandas,numpy,pymssql,mysql模块
记得安装好

import pandas as pd
import numpy as np
import pymssql
import mysql,connector

4.2 连接MySQL

方法一
使用pymssql API 和read_sql从SQL Server实例中产所和加载数据

query = "SELECT studentid,school,sex,age,famsize,\
    medu AS mothereducation,fedu AS fathereucation,\
    traveltime,studytime,failures,famrel,freetime,\
    goout,g1 AS gradeperiod1,g2 AS gradeperiod2,\
    g3 AS gradeperiod3 From studentmath"
    
server = "pdcc.c9sqqzd5fulv.us-west-2.rds.amazonaws.com"

user = "pdccuser"
password = "pdccpass"
database = "pdcctest"

conn = pymssql.connect(server=server,
        user=user,password=password,database=database)

studentmath = pd.read_sql(query,conn)
conn.close()

方法二
使用MySQL连接器和read_sql从MySQL中获取数据

host = "pdccmysql.c9sqqzd5fulv.us-west-2.rds.amazonaws.com"
user = "pdccuser"
password = "pdccpass"
database = "pdccschema"

connmysql = mysql.connector.connect(host=host,
    database=database,user=user,password=password)

studentmast = pd.read_sql(query,connmysql)
connmysql.close()

注意,因为前文方法一中设定了query变量,下面没有定义而是直接使用。

4.3 检查数据类型

检查数据类型和前几行:

  • 数据类型
studentmath.dtypes

运行结果如下:
在这里插入图片描述

  • 查看前几行
studentmath.head()

运行结果:

在这里插入图片描述

4.4 重新排序列

重新排序各列,设置索引,然后检查缺失值

newcolorder = ['studentid','gradeperiod1','gradeperiod2',
    'gradeperiod3','school','sex','age','famsize',
    'studytime','freetime','failures','famrel',
    'goout']
studentmath = studentmath[newcolorder]
studentmath.studentid.count()

运行如下:
在这里插入图片描述

查看唯一值:

studentmath.studentid.nunique()

运行如下
在这里插入图片描述
设置索引:

studentmath.set_index('studentid',inplace=True)

使用DataFrame的count函数检查缺失值

studentmath.count()

运行如下
在这里插入图片描述

4.5 替换数据值

使用更有提示性的值替换已编码的数据值
使用列的替换值创建一个字典,然后使用replace设置这些值

setvalues={"famrel":{1:"very bad",2:"2:bad",3:"3:neutral",
    4:"4:good",5:"5:excellent",6:"excellent"},
  "freetime":{1:"very low",2:"2:low",3:"3:neutral",
    4:"4:high",5:"5:very high"},
  "mothereducation":{0:np.nan,1:"1:k-4",2:"2:5-9",3:"3:secondary ed",
    4:"4:higher ed"},
  "fathereducation":{0:np.nan,1:"1:k-4",2:"2:5-9",3:"3:secondary ed",
    4:"4:higher ed"}}

studentmath.replace(setvalues,inplace=True)
setvalueskeys=[k for k in setvalues]

4.6 修改分类

4.7 计算列中值的百分比

4.8 apply计算多个列百分比值




小结

写本文主要是为了分享我的学习过程,也是给自己记个笔记,哪里忘记了,回来再看一眼,也可以很快的回想起来

未完待续

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值