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 | 填充缺失值数据 |
notnull | isnull的逆 |
在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方法
-
用常数填充:如果再pandas中填充数据缺失值,可以使用fillna()方法来实现,该方法会将缺失值更换为一个指定的常数值,如 fillna(n) ,运行结果如下图
-
用字典填充:在填充缺失值是,可以以列为单位进行,如fillna({0:1,1:5,2:10}),运行结果如下图
上述语句表示将索引为0列的缺失值填充为1,将索引为1列的缺失值填充为5,索引为2列的缺失值填充为10 -
用method方法填充,在填充缺失值时,可以使用前面出现的值填充后面同列的缺失值,如 fillna(method=‘ffill’),运行结果如下图
从图中可以看出,fillna(method=‘ffill’)表示按列为单位,将缺失值填充为之前出现的值,其中method为插值方法,如果fillna没有指定其他参数,则默认为ffill。另外,对数据进行填充,可以使用语句fillna(method=‘pad’)实现,也就是用前一个非缺失值填充该缺失值,运行结果如下
-
用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.清洗重复数据
- 清除重复的最后一行数据
可使用frame.drop_duplicates()实现,用于返回一个移除了重复行的DataFrame,结果如下
- 清除指定行数据
可使用语句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'))