Pandas大数据清洗实战之二:牛刀小试

1、数据准备

csv是以纯文本形式存储的表格数据,接下来讲述使用pandas读取和操作csv中的数据
首先准备csv文件,内容如下:

white,red,blue,pink,black,green,animal
1,2,3,4,5,6,cat
2,3,6,1,2,3,dog
1,2,5,3,7,6,ping
2,3,4,6,2,1,mouse

上述文件记录了动物的颜色数据,该文件保存成3.csv,即可使用pandas读取

2、从CSV中读取数据

(1)pandas读取CSV文件的方法

在pandas中处理CSV文件的方法主要有两个,read_csv() 和 to_csv()。其中 read_csv() 表示读取CSV内容并返回DataFrame,to_csv() 是 read_csv()的逆过程,pandas处理CSV的方法及含义如下表所示

方 法含 义
read_csv()读取CSV文件
to_csv()写入CSV文件

在pandas中读取CSV文件代码为

pd.read_csv("filename")

其中filename表示要读取的CSV文件名称,在filename后面还可以加一些参数,如下表

参数含 义
header表头,默认不为空
prefix在没有列标题时,给列加前缀
sep指定分隔符。
index_col用作行索引的列编号或者列名
delimiter定界符,备选分隔符
usecols返回一个数据子集,即选取某几列
squeeze如果包含一列,则返回Series
data_parser用于解析日期的函数
dtype每列数据的数据类型
nrows需要读取的行数
(2)读取CSV实例

1.直接读取文件

import pandas as pd
import numpy as np
df=pd.read_csv("C:\\learning\\python\\3.csv",header=0)
print(df)
print(df.dtypes)

上述语句使用pd.read_csv方法读取了一个名称为3.csv的文件,其中读取的数据类型为DataFrame,header=0代表第一行是数据而不是文件的第一行,通过df.dtypes查看每列的数据类型,运行结果如下所示
在这里插入图片描述
2.读取时加上行索引
如果将header=0换成head=None,则会自动为行加上索引,运行结果如下所示
在这里插入图片描述
3.读取时加上列索引
如果将header=0换成index_col=0,则会自动为列加上索引,运行结果如下所示
在这里插入图片描述

4.读取时提取某几行
如果只需要读取原始数据的前两行,可以通过 nrows=2 来实现,运行结果如下
在这里插入图片描述

5.读取时跳过某几行
如果想跳过原始数据的前几行,可以通过skiprows 实现,比如 skiprows=[1,2,3],表示跳过原始数据的前3行,运行结果如下
在这里插入图片描述
6.读取含有缺失值的文件
使用pandas读取文件是,会默认将NA,NULL等当做缺失值,并默认使用NaN进行替代。首先创建一个含有缺失值的文件4.csv,内容如下:

white,red,blue,pink,black,green,animal
1,2,3,4,5,6,cat
2,3,6,NA,2,3,dog
1,2,5,NULL,7,6,ping
2,3,4,NA,2,1,mouse

直接读取含有缺失值的文件,代码如下

import pandas as pd
import numpy as np
df=pd.read_csv("C:\\learning\\python\\4.csv")
print(df)

运行结果如下图所示
在这里插入图片描述
如果想将csv文件中的数据值更改为缺失值,可以使用 na_values方法实现,执行代码如下

import pandas as pd
import numpy as np
df=pd.read_csv("C:\\learning\\python\\4.csv",na_values=["1"])
print(df)

上述语句将文件中数值为1的值更改为缺失值,并用NaN代替,运行结果如下图所示
在这里插入图片描述

3、pandas数据清洗

(1)pandas处理数据缺失值

在pandas中可以使用dropna()方法来处理数据缺失值,使用cleaned()方法来清除缺失值,使用 isnull()方法标明缺失值,使用fillna()方法填充缺失值,具体参见下表

方 法描 述
cleaned清除所有缺失值
dropna根据条件过滤缺失值
isnull返回一个布尔型,标明缺失值
fillna填充缺失值数据
notnullisnull的逆

在pandas中处理数据缺失值,代码如下

import pandas as pd
import numpy as np
frame=pd.DataFrame([[1,2,3,None],[4,7,None,3],[None,None,None,None]])
frame

上述语句的每一行都有None,pandas中使用浮点值NaN表示,运行结果如下图
在这里插入图片描述
要查看是否有缺失值,使用语句frame.info()可以发现每一列中存在的缺失值,结果如下图
在这里插入图片描述
1.dropna方法
如果要丢弃全为NaN的行,可以使用 how='all’方法来实现,结果如下图
在这里插入图片描述
2.isnull 方法
如果标明哪些数据是缺失值NaN,可以使用isnull方法,运行结果如下图
在这里插入图片描述

3.fillna方法

  1. 用常数填充:如果再pandas中填充数据缺失值,可以使用fillna()方法来实现,该方法会将缺失值更换为一个指定的常数值,如 fillna(n) ,运行结果如下图
    在这里插入图片描述

  2. 用字典填充:在填充缺失值是,可以以列为单位进行,如fillna({0:1,1:5,2:10}),运行结果如下图
    在这里插入图片描述
    上述语句表示将索引为0列的缺失值填充为1,将索引为1列的缺失值填充为5,索引为2列的缺失值填充为10

  3. 用method方法填充,在填充缺失值时,可以使用前面出现的值填充后面同列的缺失值,如 fillna(method=‘ffill’),运行结果如下图
    在这里插入图片描述
    从图中可以看出,fillna(method=‘ffill’)表示按列为单位,将缺失值填充为之前出现的值,其中method为插值方法,如果fillna没有指定其他参数,则默认为ffill。另外,对数据进行填充,可以使用语句fillna(method=‘pad’)实现,也就是用前一个非缺失值填充该缺失值,运行结果如下
    在这里插入图片描述

  4. 用inplace=True直接修改原始值。在填充缺失值,可以使用inplace=True直接修改原来的值,如fillna(1,inplace=True),可以将缺失值改为1,结果如下
    在这里插入图片描述

(3)pandas处理重复值

可以使用duplicated和drop_duplicated清洗重复数据,具体含义见下表

方 法描述
duplicated()查找重复值
drop_duplicated()清洗重复值

首先构造重复数据,执行如下代码

import pandas as pd
import numpy as np
frame=pd.DataFrame({'a':['one']*2+['two']*3,'b':[1,1,2,2,3]})
frame

执行上述语句会出现很多行重复的数据,如下图
在这里插入图片描述
1.检查重复数据
使用语句frame.duplicated().value_counts()统计重复数据的个数,运行结果如下
在这里插入图片描述
True=2表示存在两个重复数据
也可以书写语句frame.duplicated()直接返回一个布尔型,查看每一行是否重复,结果如下
在这里插入图片描述
上图可看出第1行和第3行都重复,其他不重复

2.清洗重复数据

  1. 清除重复的最后一行数据
    可使用frame.drop_duplicates()实现,用于返回一个移除了重复行的DataFrame,结果如下
    在这里插入图片描述
  2. 清除指定行数据
    可使用语句frame.drop_duplicates([‘a’]),移除了指定为a列的重复行数据,结果如下

在这里插入图片描述
3.pandas合并数据
可使用merge()方法将不同DataFrame行连接起来,就像在SQL中连接关系数据库一样,下表列出了merge的一些参数

参 数描 述
left参与合并的左侧DataFrame
right参与合并的右侧DataFrame
how合并连接方式
on用于连接的索引的名称
left_on左侧DataFrame用于连接的列名
right_on右侧DataFrame用于连接的列名
left_index将左侧的行索引用作其连接键
right_index将左侧的行索引用作其连接键

构造两个数据并合并

import pandas as pd
import numpy as np
data1=pd.DataFrame({'level1':['a','b','c','d'],'numeber1':[1,3,5,7]})
data2=pd.DataFrame({'level2':['a','b','c','e'],'numeber1':[2,4,6,8]})
print(pd.merge(data1,data2,left_on='level1',right_on='level2'))

上述语句构造了两个DataFrame,并使用pd.merge进行了合并。其中,在合并只显示了相同标签的字段,其他字段被丢弃,left_on指定用于左侧连接的列名,right_on指定了右侧连接的列名,如下图
在这里插入图片描述
如果再两个DataFrame列名不同的情况下进行连接,可以加上语句“how=left”显示全部的列名,如

print(pd.merge(data1,data2,left_on='level1',right_on='level2',how='left'))

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值